diff options
Diffstat (limited to 'drivers/gpu/drm/tegra/dsi.c')
| -rw-r--r-- | drivers/gpu/drm/tegra/dsi.c | 228 | 
1 files changed, 101 insertions, 127 deletions
diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c index 046649ec9441..4d2ed966f9e3 100644 --- a/drivers/gpu/drm/tegra/dsi.c +++ b/drivers/gpu/drm/tegra/dsi.c @@ -65,8 +65,6 @@ struct tegra_dsi {  	struct clk *clk;  	struct drm_info_list *debugfs_files; -	struct drm_minor *minor; -	struct dentry *debugfs;  	unsigned long flags;  	enum mipi_dsi_pixel_format format; @@ -122,12 +120,89 @@ static inline void tegra_dsi_writel(struct tegra_dsi *dsi, u32 value,  	writel(value, dsi->regs + (offset << 2));  } +#define DEBUGFS_REG32(_name) { .name = #_name, .offset = _name } + +static const struct debugfs_reg32 tegra_dsi_regs[] = { +	DEBUGFS_REG32(DSI_INCR_SYNCPT), +	DEBUGFS_REG32(DSI_INCR_SYNCPT_CONTROL), +	DEBUGFS_REG32(DSI_INCR_SYNCPT_ERROR), +	DEBUGFS_REG32(DSI_CTXSW), +	DEBUGFS_REG32(DSI_RD_DATA), +	DEBUGFS_REG32(DSI_WR_DATA), +	DEBUGFS_REG32(DSI_POWER_CONTROL), +	DEBUGFS_REG32(DSI_INT_ENABLE), +	DEBUGFS_REG32(DSI_INT_STATUS), +	DEBUGFS_REG32(DSI_INT_MASK), +	DEBUGFS_REG32(DSI_HOST_CONTROL), +	DEBUGFS_REG32(DSI_CONTROL), +	DEBUGFS_REG32(DSI_SOL_DELAY), +	DEBUGFS_REG32(DSI_MAX_THRESHOLD), +	DEBUGFS_REG32(DSI_TRIGGER), +	DEBUGFS_REG32(DSI_TX_CRC), +	DEBUGFS_REG32(DSI_STATUS), +	DEBUGFS_REG32(DSI_INIT_SEQ_CONTROL), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_0), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_1), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_2), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_3), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_4), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_5), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_6), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_7), +	DEBUGFS_REG32(DSI_PKT_SEQ_0_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_0_HI), +	DEBUGFS_REG32(DSI_PKT_SEQ_1_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_1_HI), +	DEBUGFS_REG32(DSI_PKT_SEQ_2_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_2_HI), +	DEBUGFS_REG32(DSI_PKT_SEQ_3_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_3_HI), +	DEBUGFS_REG32(DSI_PKT_SEQ_4_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_4_HI), +	DEBUGFS_REG32(DSI_PKT_SEQ_5_LO), +	DEBUGFS_REG32(DSI_PKT_SEQ_5_HI), +	DEBUGFS_REG32(DSI_DCS_CMDS), +	DEBUGFS_REG32(DSI_PKT_LEN_0_1), +	DEBUGFS_REG32(DSI_PKT_LEN_2_3), +	DEBUGFS_REG32(DSI_PKT_LEN_4_5), +	DEBUGFS_REG32(DSI_PKT_LEN_6_7), +	DEBUGFS_REG32(DSI_PHY_TIMING_0), +	DEBUGFS_REG32(DSI_PHY_TIMING_1), +	DEBUGFS_REG32(DSI_PHY_TIMING_2), +	DEBUGFS_REG32(DSI_BTA_TIMING), +	DEBUGFS_REG32(DSI_TIMEOUT_0), +	DEBUGFS_REG32(DSI_TIMEOUT_1), +	DEBUGFS_REG32(DSI_TO_TALLY), +	DEBUGFS_REG32(DSI_PAD_CONTROL_0), +	DEBUGFS_REG32(DSI_PAD_CONTROL_CD), +	DEBUGFS_REG32(DSI_PAD_CD_STATUS), +	DEBUGFS_REG32(DSI_VIDEO_MODE_CONTROL), +	DEBUGFS_REG32(DSI_PAD_CONTROL_1), +	DEBUGFS_REG32(DSI_PAD_CONTROL_2), +	DEBUGFS_REG32(DSI_PAD_CONTROL_3), +	DEBUGFS_REG32(DSI_PAD_CONTROL_4), +	DEBUGFS_REG32(DSI_GANGED_MODE_CONTROL), +	DEBUGFS_REG32(DSI_GANGED_MODE_START), +	DEBUGFS_REG32(DSI_GANGED_MODE_SIZE), +	DEBUGFS_REG32(DSI_RAW_DATA_BYTE_COUNT), +	DEBUGFS_REG32(DSI_ULTRA_LOW_POWER_CONTROL), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_8), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_9), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_10), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_11), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_12), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_13), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_14), +	DEBUGFS_REG32(DSI_INIT_SEQ_DATA_15), +}; +  static int tegra_dsi_show_regs(struct seq_file *s, void *data)  {  	struct drm_info_node *node = s->private;  	struct tegra_dsi *dsi = node->info_ent->data;  	struct drm_crtc *crtc = dsi->output.encoder.crtc;  	struct drm_device *drm = node->minor->dev; +	unsigned int i;  	int err = 0;  	drm_modeset_lock_all(drm); @@ -137,93 +212,12 @@ static int tegra_dsi_show_regs(struct seq_file *s, void *data)  		goto unlock;  	} -#define DUMP_REG(name)						\ -	seq_printf(s, "%-32s %#05x %08x\n", #name, name,	\ -		   tegra_dsi_readl(dsi, name)) - -	DUMP_REG(DSI_INCR_SYNCPT); -	DUMP_REG(DSI_INCR_SYNCPT_CONTROL); -	DUMP_REG(DSI_INCR_SYNCPT_ERROR); -	DUMP_REG(DSI_CTXSW); -	DUMP_REG(DSI_RD_DATA); -	DUMP_REG(DSI_WR_DATA); -	DUMP_REG(DSI_POWER_CONTROL); -	DUMP_REG(DSI_INT_ENABLE); -	DUMP_REG(DSI_INT_STATUS); -	DUMP_REG(DSI_INT_MASK); -	DUMP_REG(DSI_HOST_CONTROL); -	DUMP_REG(DSI_CONTROL); -	DUMP_REG(DSI_SOL_DELAY); -	DUMP_REG(DSI_MAX_THRESHOLD); -	DUMP_REG(DSI_TRIGGER); -	DUMP_REG(DSI_TX_CRC); -	DUMP_REG(DSI_STATUS); - -	DUMP_REG(DSI_INIT_SEQ_CONTROL); -	DUMP_REG(DSI_INIT_SEQ_DATA_0); -	DUMP_REG(DSI_INIT_SEQ_DATA_1); -	DUMP_REG(DSI_INIT_SEQ_DATA_2); -	DUMP_REG(DSI_INIT_SEQ_DATA_3); -	DUMP_REG(DSI_INIT_SEQ_DATA_4); -	DUMP_REG(DSI_INIT_SEQ_DATA_5); -	DUMP_REG(DSI_INIT_SEQ_DATA_6); -	DUMP_REG(DSI_INIT_SEQ_DATA_7); - -	DUMP_REG(DSI_PKT_SEQ_0_LO); -	DUMP_REG(DSI_PKT_SEQ_0_HI); -	DUMP_REG(DSI_PKT_SEQ_1_LO); -	DUMP_REG(DSI_PKT_SEQ_1_HI); -	DUMP_REG(DSI_PKT_SEQ_2_LO); -	DUMP_REG(DSI_PKT_SEQ_2_HI); -	DUMP_REG(DSI_PKT_SEQ_3_LO); -	DUMP_REG(DSI_PKT_SEQ_3_HI); -	DUMP_REG(DSI_PKT_SEQ_4_LO); -	DUMP_REG(DSI_PKT_SEQ_4_HI); -	DUMP_REG(DSI_PKT_SEQ_5_LO); -	DUMP_REG(DSI_PKT_SEQ_5_HI); - -	DUMP_REG(DSI_DCS_CMDS); - -	DUMP_REG(DSI_PKT_LEN_0_1); -	DUMP_REG(DSI_PKT_LEN_2_3); -	DUMP_REG(DSI_PKT_LEN_4_5); -	DUMP_REG(DSI_PKT_LEN_6_7); - -	DUMP_REG(DSI_PHY_TIMING_0); -	DUMP_REG(DSI_PHY_TIMING_1); -	DUMP_REG(DSI_PHY_TIMING_2); -	DUMP_REG(DSI_BTA_TIMING); - -	DUMP_REG(DSI_TIMEOUT_0); -	DUMP_REG(DSI_TIMEOUT_1); -	DUMP_REG(DSI_TO_TALLY); - -	DUMP_REG(DSI_PAD_CONTROL_0); -	DUMP_REG(DSI_PAD_CONTROL_CD); -	DUMP_REG(DSI_PAD_CD_STATUS); -	DUMP_REG(DSI_VIDEO_MODE_CONTROL); -	DUMP_REG(DSI_PAD_CONTROL_1); -	DUMP_REG(DSI_PAD_CONTROL_2); -	DUMP_REG(DSI_PAD_CONTROL_3); -	DUMP_REG(DSI_PAD_CONTROL_4); - -	DUMP_REG(DSI_GANGED_MODE_CONTROL); -	DUMP_REG(DSI_GANGED_MODE_START); -	DUMP_REG(DSI_GANGED_MODE_SIZE); - -	DUMP_REG(DSI_RAW_DATA_BYTE_COUNT); -	DUMP_REG(DSI_ULTRA_LOW_POWER_CONTROL); - -	DUMP_REG(DSI_INIT_SEQ_DATA_8); -	DUMP_REG(DSI_INIT_SEQ_DATA_9); -	DUMP_REG(DSI_INIT_SEQ_DATA_10); -	DUMP_REG(DSI_INIT_SEQ_DATA_11); -	DUMP_REG(DSI_INIT_SEQ_DATA_12); -	DUMP_REG(DSI_INIT_SEQ_DATA_13); -	DUMP_REG(DSI_INIT_SEQ_DATA_14); -	DUMP_REG(DSI_INIT_SEQ_DATA_15); - -#undef DUMP_REG +	for (i = 0; i < ARRAY_SIZE(tegra_dsi_regs); i++) { +		unsigned int offset = tegra_dsi_regs[i].offset; + +		seq_printf(s, "%-32s %#05x %08x\n", tegra_dsi_regs[i].name, +			   offset, tegra_dsi_readl(dsi, offset)); +	}  unlock:  	drm_modeset_unlock_all(drm); @@ -234,58 +228,46 @@ static struct drm_info_list debugfs_files[] = {  	{ "regs", tegra_dsi_show_regs, 0, NULL },  }; -static int tegra_dsi_debugfs_init(struct tegra_dsi *dsi, -				  struct drm_minor *minor) +static int tegra_dsi_late_register(struct drm_connector *connector)  { -	const char *name = dev_name(dsi->dev); -	unsigned int i; +	struct tegra_output *output = connector_to_output(connector); +	unsigned int i, count = ARRAY_SIZE(debugfs_files); +	struct drm_minor *minor = connector->dev->primary; +	struct dentry *root = connector->debugfs_entry; +	struct tegra_dsi *dsi = to_dsi(output);  	int err; -	dsi->debugfs = debugfs_create_dir(name, minor->debugfs_root); -	if (!dsi->debugfs) -		return -ENOMEM; -  	dsi->debugfs_files = kmemdup(debugfs_files, sizeof(debugfs_files),  				     GFP_KERNEL); -	if (!dsi->debugfs_files) { -		err = -ENOMEM; -		goto remove; -	} +	if (!dsi->debugfs_files) +		return -ENOMEM; -	for (i = 0; i < ARRAY_SIZE(debugfs_files); i++) +	for (i = 0; i < count; i++)  		dsi->debugfs_files[i].data = dsi; -	err = drm_debugfs_create_files(dsi->debugfs_files, -				       ARRAY_SIZE(debugfs_files), -				       dsi->debugfs, minor); +	err = drm_debugfs_create_files(dsi->debugfs_files, count, root, minor);  	if (err < 0)  		goto free; -	dsi->minor = minor; -  	return 0;  free:  	kfree(dsi->debugfs_files);  	dsi->debugfs_files = NULL; -remove: -	debugfs_remove(dsi->debugfs); -	dsi->debugfs = NULL;  	return err;  } -static void tegra_dsi_debugfs_exit(struct tegra_dsi *dsi) +static void tegra_dsi_early_unregister(struct drm_connector *connector)  { -	drm_debugfs_remove_files(dsi->debugfs_files, ARRAY_SIZE(debugfs_files), -				 dsi->minor); -	dsi->minor = NULL; +	struct tegra_output *output = connector_to_output(connector); +	unsigned int count = ARRAY_SIZE(debugfs_files); +	struct tegra_dsi *dsi = to_dsi(output); +	drm_debugfs_remove_files(dsi->debugfs_files, count, +				 connector->dev->primary);  	kfree(dsi->debugfs_files);  	dsi->debugfs_files = NULL; - -	debugfs_remove(dsi->debugfs); -	dsi->debugfs = NULL;  }  #define PKT_ID0(id)	((((id) & 0x3f) <<  3) | (1 <<  9)) @@ -827,6 +809,8 @@ static const struct drm_connector_funcs tegra_dsi_connector_funcs = {  	.destroy = tegra_output_connector_destroy,  	.atomic_duplicate_state = tegra_dsi_connector_duplicate_state,  	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state, +	.late_register = tegra_dsi_late_register, +	.early_unregister = tegra_dsi_early_unregister,  };  static enum drm_mode_status @@ -1080,12 +1064,6 @@ static int tegra_dsi_init(struct host1x_client *client)  		dsi->output.encoder.possible_crtcs = 0x3;  	} -	if (IS_ENABLED(CONFIG_DEBUG_FS)) { -		err = tegra_dsi_debugfs_init(dsi, drm->primary); -		if (err < 0) -			dev_err(dsi->dev, "debugfs setup failed: %d\n", err); -	} -  	return 0;  } @@ -1094,10 +1072,6 @@ static int tegra_dsi_exit(struct host1x_client *client)  	struct tegra_dsi *dsi = host1x_client_to_dsi(client);  	tegra_output_exit(&dsi->output); - -	if (IS_ENABLED(CONFIG_DEBUG_FS)) -		tegra_dsi_debugfs_exit(dsi); -  	regulator_disable(dsi->vdd);  	return 0;  |