diff options
Diffstat (limited to 'drivers/gpu/drm/drm_debugfs.c')
| -rw-r--r-- | drivers/gpu/drm/drm_debugfs.c | 65 | 
1 files changed, 62 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index f291fb4b359f..f4715a67e340 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -314,10 +314,8 @@ void drm_debugfs_dev_register(struct drm_device *dev)  		drm_framebuffer_debugfs_init(dev);  		drm_client_debugfs_init(dev);  	} -	if (drm_drv_uses_atomic_modeset(dev)) { +	if (drm_drv_uses_atomic_modeset(dev))  		drm_atomic_debugfs_init(dev); -		drm_bridge_debugfs_init(dev); -	}  }  int drm_debugfs_register(struct drm_minor *minor, int minor_id, @@ -589,4 +587,65 @@ void drm_debugfs_crtc_remove(struct drm_crtc *crtc)  	crtc->debugfs_entry = NULL;  } +static int bridges_show(struct seq_file *m, void *data) +{ +	struct drm_encoder *encoder = m->private; +	struct drm_printer p = drm_seq_file_printer(m); +	struct drm_bridge *bridge; +	unsigned int idx = 0; + +	drm_for_each_bridge_in_chain(encoder, bridge) { +		drm_printf(&p, "bridge[%d]: %ps\n", idx++, bridge->funcs); +		drm_printf(&p, "\ttype: [%d] %s\n", +			   bridge->type, +			   drm_get_connector_type_name(bridge->type)); +#ifdef CONFIG_OF +		if (bridge->of_node) +			drm_printf(&p, "\tOF: %pOFfc\n", bridge->of_node); +#endif +		drm_printf(&p, "\tops: [0x%x]", bridge->ops); +		if (bridge->ops & DRM_BRIDGE_OP_DETECT) +			drm_puts(&p, " detect"); +		if (bridge->ops & DRM_BRIDGE_OP_EDID) +			drm_puts(&p, " edid"); +		if (bridge->ops & DRM_BRIDGE_OP_HPD) +			drm_puts(&p, " hpd"); +		if (bridge->ops & DRM_BRIDGE_OP_MODES) +			drm_puts(&p, " modes"); +		drm_puts(&p, "\n"); +	} + +	return 0; +} +DEFINE_SHOW_ATTRIBUTE(bridges); + +void drm_debugfs_encoder_add(struct drm_encoder *encoder) +{ +	struct drm_minor *minor = encoder->dev->primary; +	struct dentry *root; +	char *name; + +	name = kasprintf(GFP_KERNEL, "encoder-%d", encoder->index); +	if (!name) +		return; + +	root = debugfs_create_dir(name, minor->debugfs_root); +	kfree(name); + +	encoder->debugfs_entry = root; + +	/* bridges list */ +	debugfs_create_file("bridges", 0444, root, encoder, +			    &bridges_fops); + +	if (encoder->funcs && encoder->funcs->debugfs_init) +		encoder->funcs->debugfs_init(encoder, root); +} + +void drm_debugfs_encoder_remove(struct drm_encoder *encoder) +{ +	debugfs_remove_recursive(encoder->debugfs_entry); +	encoder->debugfs_entry = NULL; +} +  #endif /* CONFIG_DEBUG_FS */ | 
