struct exynos_drm_panel_info *panel)
{
struct fb_videomode *timing = &panel->timing;
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(mode), mode->name);
mode->clock = timing->pixclock / 1000;
mode->vrefresh = timing->refresh;
convert_to_video_timing(struct fb_videomode *timing,
struct drm_display_mode *mode)
{
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(mode), mode->name);
memset(timing, 0, sizeof(*timing));
{
struct exynos_drm_display *display = display_from_connector(connector);
int ret;
- void *edid;
+ struct edid *edid;
+
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector));
if (!display->panel_ops->get_edid)
return -EINVAL;
- edid = kzalloc(MAX_EDID, GFP_KERNEL);
- if (!edid) {
- DRM_ERROR("failed to allocate edid\n");
- return -ENOMEM;
- }
-
- ret = display->panel_ops->get_edid(display->panel_ctx,
- connector, edid, MAX_EDID);
- if (ret) {
+ edid = display->panel_ops->get_edid(display->panel_ctx, connector);
+ if (IS_ERR_OR_NULL(edid)) {
+ ret = PTR_ERR(edid);
+ edid = NULL;
DRM_ERROR("Panel operation get_edid failed %d\n", ret);
- goto err;
+ goto out;
}
ret = drm_mode_connector_update_edid_property(connector, edid);
if (ret) {
DRM_ERROR("update edid property failed(%d)\n", ret);
- goto err;
+ goto out;
}
ret = drm_add_edid_modes(connector, edid);
if (ret < 0) {
DRM_ERROR("Add edid modes failed %d\n", ret);
- goto err;
+ goto out;
}
- kfree(connector->display_info.raw_edid);
- connector->display_info.raw_edid = edid;
-
- return ret;
-
-err:
+out:
+ connector->display_info.raw_edid = NULL;
kfree(edid);
return ret;
}
struct exynos_drm_display *display = display_from_connector(connector);
struct drm_display_mode *mode;
struct exynos_drm_panel_info *panel;
- int ret;
+
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector));
if (!display->controller_ops->get_panel)
return -EINVAL;
- panel = display->controller_ops->get_panel(
- display->controller_ctx);
-
- for (ret = 0; panel && ret < MAX_NR_PANELS; ret++) {
- if (panel[ret].timing.xres == -1 &&
- panel[ret].timing.yres == -1)
- break;
+ panel = display->controller_ops->get_panel(display->controller_ctx);
- mode = drm_mode_create(connector->dev);
- mode->type = DRM_MODE_TYPE_DRIVER;
+ mode = drm_mode_create(connector->dev);
+ mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
- /* Only the first panel is preferred mode */
- if (ret)
- mode->type |= DRM_MODE_TYPE_PREFERRED;
- else
- mode->type |= DRM_MODE_TYPE_USERDEF;
-
- convert_to_display_mode(mode, &panel[ret]);
- connector->display_info.width_mm = mode->width_mm;
- connector->display_info.height_mm = mode->height_mm;
- drm_mode_set_name(mode);
- drm_mode_probed_add(connector, mode);
- }
+ convert_to_display_mode(mode, panel);
+ connector->display_info.width_mm = mode->width_mm;
+ connector->display_info.height_mm = mode->height_mm;
+ drm_mode_set_name(mode);
+ drm_mode_probed_add(connector, mode);
- return ret;
+ return 1;
}
static int exynos_drm_connector_get_modes(struct drm_connector *connector)
{
int ret;
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector));
/*
* First try getting modes from EDID. If that doesn't yield any results,
struct fb_videomode timing;
int ret = MODE_BAD;
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] [MODE:%d:%s]\n",
+ DRM_BASE_ID(connector),
+ drm_get_connector_name(connector), DRM_BASE_ID(mode),
+ mode->name);
convert_to_video_timing(&timing, mode);
struct drm_mode_object *obj;
struct drm_encoder *encoder;
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector));
obj = drm_mode_object_find(dev, exynos_connector->encoder_id,
DRM_MODE_OBJECT_ENCODER);
encoder = obj_to_encoder(obj);
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] == [ENCODER:%d:%s]\n",
+ DRM_BASE_ID(connector),
+ drm_get_connector_name(connector),
+ DRM_BASE_ID(encoder), drm_get_encoder_name(encoder));
+
return encoder;
}
+struct drm_bridge *exynos_drm_best_bridge(struct drm_connector *connector)
+{
+ struct drm_device *dev = connector->dev;
+ struct drm_bridge *bridge;
+
+ list_for_each_entry(bridge, &dev->mode_config.bridge_list, head) {
+ if (bridge->connector_type == connector->connector_type)
+ return bridge;
+ }
+ return NULL;
+}
+
static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {
.get_modes = exynos_drm_connector_get_modes,
.mode_valid = exynos_drm_connector_mode_valid,
.best_encoder = exynos_drm_best_encoder,
+ .best_bridge = exynos_drm_best_bridge,
};
static int exynos_drm_connector_fill_modes(struct drm_connector *connector,
unsigned int max_width, unsigned int max_height)
{
struct exynos_drm_display *display = display_from_connector(connector);
+ int ret;
unsigned int width, height;
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] %d x %d\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector), max_width,
+ max_height);
+
width = max_width;
height = max_height;
display->panel_ops->get_max_res(display->panel_ctx, &width,
&height);
- return drm_helper_probe_single_connector_modes(connector, width,
+ ret = drm_helper_probe_single_connector_modes(connector, width,
height);
+ if (ret < 0) {
+ DRM_ERROR("Failed to probe connector modes ret=%d\n", ret);
+ return ret;
+ }
+
+ if (display->controller_ops->adjust_modes)
+ display->controller_ops->adjust_modes(display->controller_ctx,
+ connector);
+
+ return ret;
}
/* get detection status of display device. */
struct exynos_drm_display *display = display_from_connector(connector);
enum drm_connector_status status;
- DRM_DEBUG_KMS("%s\n", __FILE__);
-
if (display->panel_ops->is_connected &&
display->panel_ops->is_connected(display->panel_ctx))
status = connector_status_connected;
else
status = connector_status_disconnected;
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force: %d == %s\n",
+ DRM_BASE_ID(connector),
+ drm_get_connector_name(connector), force,
+ drm_get_connector_status_name(status));
+
return status;
}
struct exynos_drm_connector *exynos_connector =
to_exynos_connector(connector);
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
+ drm_get_connector_name(connector));
drm_sysfs_connector_remove(connector);
drm_connector_cleanup(connector);
int type;
int err;
- DRM_DEBUG_KMS("%s\n", __FILE__);
+ DRM_DEBUG_KMS("[DEV:%s] [ENCODER:%d:%s]\n", dev->devname,
+ DRM_BASE_ID(encoder), drm_get_encoder_name(encoder));
exynos_connector = kzalloc(sizeof(*exynos_connector), GFP_KERNEL);
if (!exynos_connector) {
}
connector = &exynos_connector->drm_connector;
+ connector->dpms = DRM_MODE_DPMS_OFF;
switch (display->display_type) {
case EXYNOS_DRM_DISPLAY_TYPE_MIXER:
goto err_sysfs;
}
- DRM_DEBUG_KMS("connector has been created\n");
+ DRM_DEBUG_KMS("New [CONNECTOR:%d:%s] attached to [ENCODER:%d:%s]\n",
+ DRM_BASE_ID(connector),
+ drm_get_connector_name(connector),
+ DRM_BASE_ID(encoder), drm_get_encoder_name(encoder));
return connector;