diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/dss')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dispc.c | 228 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/display.c | 78 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dpi.c | 40 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dsi.c | 160 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dss.h | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi4.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi4_core.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi5.c | 31 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi5_core.c | 85 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/hdmi_wp.c | 73 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/omapdss.h | 98 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/output.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/rfbi.c | 49 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/sdi.c | 33 | ||||
| -rw-r--r-- | drivers/gpu/drm/omapdrm/dss/venc.c | 97 | 
16 files changed, 438 insertions, 591 deletions
| diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c index 535240fba671..c839f6456db2 100644 --- a/drivers/gpu/drm/omapdrm/dss/dispc.c +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c @@ -75,7 +75,7 @@ struct dispc_features {  	unsigned long max_lcd_pclk;  	unsigned long max_tv_pclk;  	int (*calc_scaling) (unsigned long pclk, unsigned long lclk, -		const struct omap_video_timings *mgr_timings, +		const struct videomode *vm,  		u16 width, u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode, bool *five_taps,  		int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, @@ -1679,7 +1679,7 @@ static void dispc_ovl_set_scaling_uv(enum omap_plane plane,  {  	int scale_x = out_width != orig_width;  	int scale_y = out_height != orig_height; -	bool chroma_upscale = plane != OMAP_DSS_WB ? true : false; +	bool chroma_upscale = plane != OMAP_DSS_WB;  	if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))  		return; @@ -2179,7 +2179,7 @@ static void calc_tiler_rotation_offset(u16 screen_width, u16 width,   * undocumented horizontal position and timing related limitations.   */  static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk, -		const struct omap_video_timings *t, u16 pos_x, +		const struct videomode *vm, u16 pos_x,  		u16 width, u16 height, u16 out_width, u16 out_height,  		bool five_taps)  { @@ -2189,14 +2189,16 @@ static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk,  	u64 val, blank;  	int i; -	nonactive = t->x_res + t->hfp + t->hsw + t->hbp - out_width; +	nonactive = vm->hactive + vm->hfront_porch + vm->hsync_len + +		    vm->hback_porch - out_width;  	i = 0;  	if (out_height < height)  		i++;  	if (out_width < width)  		i++; -	blank = div_u64((u64)(t->hbp + t->hsw + t->hfp) * lclk, pclk); +	blank = div_u64((u64)(vm->hback_porch + vm->hsync_len + vm->hfront_porch) * +			lclk, pclk);  	DSSDBG("blanking period + ppl = %llu (limit = %u)\n", blank, limits[i]);  	if (blank <= limits[i])  		return -EINVAL; @@ -2231,7 +2233,7 @@ static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk,  }  static unsigned long calc_core_clk_five_taps(unsigned long pclk, -		const struct omap_video_timings *mgr_timings, u16 width, +		const struct videomode *vm, u16 width,  		u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode)  { @@ -2242,7 +2244,7 @@ static unsigned long calc_core_clk_five_taps(unsigned long pclk,  		return (unsigned long) pclk;  	if (height > out_height) { -		unsigned int ppl = mgr_timings->x_res; +		unsigned int ppl = vm->hactive;  		tmp = (u64)pclk * height * out_width;  		do_div(tmp, 2 * out_height * ppl); @@ -2324,7 +2326,7 @@ static unsigned long calc_core_clk_44xx(unsigned long pclk, u16 width,  }  static int dispc_ovl_calc_scaling_24xx(unsigned long pclk, unsigned long lclk, -		const struct omap_video_timings *mgr_timings, +		const struct videomode *vm,  		u16 width, u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode, bool *five_taps,  		int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, @@ -2370,7 +2372,7 @@ static int dispc_ovl_calc_scaling_24xx(unsigned long pclk, unsigned long lclk,  }  static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk, -		const struct omap_video_timings *mgr_timings, +		const struct videomode *vm,  		u16 width, u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode, bool *five_taps,  		int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, @@ -2392,7 +2394,7 @@ static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk,  				*five_taps = false;  again:  		if (*five_taps) -			*core_clk = calc_core_clk_five_taps(pclk, mgr_timings, +			*core_clk = calc_core_clk_five_taps(pclk, vm,  						in_width, in_height, out_width,  						out_height, color_mode);  		else @@ -2400,7 +2402,7 @@ again:  					in_height, out_width, out_height,  					mem_to_mem); -		error = check_horiz_timing_omap3(pclk, lclk, mgr_timings, +		error = check_horiz_timing_omap3(pclk, lclk, vm,  				pos_x, in_width, in_height, out_width,  				out_height, *five_taps);  		if (error && *five_taps) { @@ -2435,7 +2437,7 @@ again:  		return -EINVAL;  	} -	if (check_horiz_timing_omap3(pclk, lclk, mgr_timings, pos_x, in_width, +	if (check_horiz_timing_omap3(pclk, lclk, vm, pos_x, in_width,  				in_height, out_width, out_height, *five_taps)) {  			DSSERR("horizontal timing too tight\n");  			return -EINVAL; @@ -2455,7 +2457,7 @@ again:  }  static int dispc_ovl_calc_scaling_44xx(unsigned long pclk, unsigned long lclk, -		const struct omap_video_timings *mgr_timings, +		const struct videomode *vm,  		u16 width, u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode, bool *five_taps,  		int *x_predecim, int *y_predecim, int *decim_x, int *decim_y, @@ -2501,7 +2503,7 @@ static int dispc_ovl_calc_scaling_44xx(unsigned long pclk, unsigned long lclk,  static int dispc_ovl_calc_scaling(unsigned long pclk, unsigned long lclk,  		enum omap_overlay_caps caps, -		const struct omap_video_timings *mgr_timings, +		const struct videomode *vm,  		u16 width, u16 height, u16 out_width, u16 out_height,  		enum omap_color_mode color_mode, bool *five_taps,  		int *x_predecim, int *y_predecim, u16 pos_x, @@ -2515,7 +2517,7 @@ static int dispc_ovl_calc_scaling(unsigned long pclk, unsigned long lclk,  	if (width == out_width && height == out_height)  		return 0; -	if (!mem_to_mem && (pclk == 0 || mgr_timings->pixelclock == 0)) { +	if (!mem_to_mem && (pclk == 0 || vm->pixelclock == 0)) {  		DSSERR("cannot calculate scaling settings: pclk is zero\n");  		return -EINVAL;  	} @@ -2551,7 +2553,7 @@ static int dispc_ovl_calc_scaling(unsigned long pclk, unsigned long lclk,  	if (decim_y > *y_predecim || out_height > height * 8)  		return -EINVAL; -	ret = dispc.feat->calc_scaling(pclk, lclk, mgr_timings, width, height, +	ret = dispc.feat->calc_scaling(pclk, lclk, vm, width, height,  		out_width, out_height, color_mode, five_taps,  		x_predecim, y_predecim, &decim_x, &decim_y, pos_x, &core_clk,  		mem_to_mem); @@ -2591,7 +2593,7 @@ static int dispc_ovl_setup_common(enum omap_plane plane,  		u16 out_width, u16 out_height, enum omap_color_mode color_mode,  		u8 rotation, bool mirror, u8 zorder, u8 pre_mult_alpha,  		u8 global_alpha, enum omap_dss_rotation_type rotation_type, -		bool replication, const struct omap_video_timings *mgr_timings, +		bool replication, const struct videomode *vm,  		bool mem_to_mem)  {  	bool five_taps = true; @@ -2605,7 +2607,7 @@ static int dispc_ovl_setup_common(enum omap_plane plane,  	u16 in_height = height;  	u16 in_width = width;  	int x_predecim = 1, y_predecim = 1; -	bool ilace = mgr_timings->interlace; +	bool ilace = !!(vm->flags & DISPLAY_FLAGS_INTERLACED);  	unsigned long pclk = dispc_plane_pclk_rate(plane);  	unsigned long lclk = dispc_plane_lclk_rate(plane); @@ -2647,7 +2649,7 @@ static int dispc_ovl_setup_common(enum omap_plane plane,  	if (!dss_feat_color_mode_supported(plane, color_mode))  		return -EINVAL; -	r = dispc_ovl_calc_scaling(pclk, lclk, caps, mgr_timings, in_width, +	r = dispc_ovl_calc_scaling(pclk, lclk, caps, vm, in_width,  			in_height, out_width, out_height, color_mode,  			&five_taps, &x_predecim, &y_predecim, pos_x,  			rotation_type, mem_to_mem); @@ -2784,7 +2786,7 @@ static int dispc_ovl_setup_common(enum omap_plane plane,  }  int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi, -		bool replication, const struct omap_video_timings *mgr_timings, +		bool replication, const struct videomode *vm,  		bool mem_to_mem)  {  	int r; @@ -2803,14 +2805,14 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,  		oi->screen_width, oi->pos_x, oi->pos_y, oi->width, oi->height,  		oi->out_width, oi->out_height, oi->color_mode, oi->rotation,  		oi->mirror, oi->zorder, oi->pre_mult_alpha, oi->global_alpha, -		oi->rotation_type, replication, mgr_timings, mem_to_mem); +		oi->rotation_type, replication, vm, mem_to_mem);  	return r;  }  EXPORT_SYMBOL(dispc_ovl_setup);  int dispc_wb_setup(const struct omap_dss_writeback_info *wi, -		bool mem_to_mem, const struct omap_video_timings *mgr_timings) +		bool mem_to_mem, const struct videomode *vm)  {  	int r;  	u32 l; @@ -2819,8 +2821,8 @@ int dispc_wb_setup(const struct omap_dss_writeback_info *wi,  	const u8 zorder = 0, global_alpha = 0;  	const bool replication = false;  	bool truncation; -	int in_width = mgr_timings->x_res; -	int in_height = mgr_timings->y_res; +	int in_width = vm->hactive; +	int in_height = vm->vactive;  	enum omap_overlay_caps caps =  		OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA; @@ -2833,7 +2835,7 @@ int dispc_wb_setup(const struct omap_dss_writeback_info *wi,  		wi->buf_width, pos_x, pos_y, in_width, in_height, wi->width,  		wi->height, wi->color_mode, wi->rotation, wi->mirror, zorder,  		wi->pre_mult_alpha, global_alpha, wi->rotation_type, -		replication, mgr_timings, mem_to_mem); +		replication, vm, mem_to_mem);  	switch (wi->color_mode) {  	case OMAP_DSS_COLOR_RGB16: @@ -2867,8 +2869,8 @@ int dispc_wb_setup(const struct omap_dss_writeback_info *wi,  	} else {  		int wbdelay; -		wbdelay = min(mgr_timings->vfp + mgr_timings->vsw + -			mgr_timings->vbp, 255); +		wbdelay = min(vm->vfront_porch + +			      vm->vsync_len + vm->vback_porch, (u32)255);  		/* WBDELAYCOUNT */  		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), wbdelay, 7, 0); @@ -3093,10 +3095,10 @@ static bool _dispc_mgr_size_ok(u16 width, u16 height)  		height <= dispc.feat->mgr_height_max;  } -static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, +static bool _dispc_lcd_timings_ok(int hsync_len, int hfp, int hbp,  		int vsw, int vfp, int vbp)  { -	if (hsw < 1 || hsw > dispc.feat->sw_max || +	if (hsync_len < 1 || hsync_len > dispc.feat->sw_max ||  			hfp < 1 || hfp > dispc.feat->hp_max ||  			hbp < 1 || hbp > dispc.feat->hp_max ||  			vsw < 1 || vsw > dispc.feat->sw_max || @@ -3110,113 +3112,77 @@ static bool _dispc_mgr_pclk_ok(enum omap_channel channel,  		unsigned long pclk)  {  	if (dss_mgr_is_lcd(channel)) -		return pclk <= dispc.feat->max_lcd_pclk ? true : false; +		return pclk <= dispc.feat->max_lcd_pclk;  	else -		return pclk <= dispc.feat->max_tv_pclk ? true : false; +		return pclk <= dispc.feat->max_tv_pclk;  } -bool dispc_mgr_timings_ok(enum omap_channel channel, -		const struct omap_video_timings *timings) +bool dispc_mgr_timings_ok(enum omap_channel channel, const struct videomode *vm)  { -	if (!_dispc_mgr_size_ok(timings->x_res, timings->y_res)) +	if (!_dispc_mgr_size_ok(vm->hactive, vm->vactive))  		return false; -	if (!_dispc_mgr_pclk_ok(channel, timings->pixelclock)) +	if (!_dispc_mgr_pclk_ok(channel, vm->pixelclock))  		return false;  	if (dss_mgr_is_lcd(channel)) {  		/* TODO: OMAP4+ supports interlace for LCD outputs */ -		if (timings->interlace) +		if (vm->flags & DISPLAY_FLAGS_INTERLACED)  			return false; -		if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp, -				timings->hbp, timings->vsw, timings->vfp, -				timings->vbp)) +		if (!_dispc_lcd_timings_ok(vm->hsync_len, +				vm->hfront_porch, vm->hback_porch, +				vm->vsync_len, vm->vfront_porch, +				vm->vback_porch))  			return false;  	}  	return true;  } -static void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw, -		int hfp, int hbp, int vsw, int vfp, int vbp, -		enum omap_dss_signal_level vsync_level, -		enum omap_dss_signal_level hsync_level, -		enum omap_dss_signal_edge data_pclk_edge, -		enum omap_dss_signal_level de_level, -		enum omap_dss_signal_edge sync_pclk_edge) - +static void _dispc_mgr_set_lcd_timings(enum omap_channel channel, +				       const struct videomode *vm)  {  	u32 timing_h, timing_v, l;  	bool onoff, rf, ipc, vs, hs, de; -	timing_h = FLD_VAL(hsw-1, dispc.feat->sw_start, 0) | -			FLD_VAL(hfp-1, dispc.feat->fp_start, 8) | -			FLD_VAL(hbp-1, dispc.feat->bp_start, 20); -	timing_v = FLD_VAL(vsw-1, dispc.feat->sw_start, 0) | -			FLD_VAL(vfp, dispc.feat->fp_start, 8) | -			FLD_VAL(vbp, dispc.feat->bp_start, 20); +	timing_h = FLD_VAL(vm->hsync_len - 1, dispc.feat->sw_start, 0) | +		   FLD_VAL(vm->hfront_porch - 1, dispc.feat->fp_start, 8) | +		   FLD_VAL(vm->hback_porch - 1, dispc.feat->bp_start, 20); +	timing_v = FLD_VAL(vm->vsync_len - 1, dispc.feat->sw_start, 0) | +		   FLD_VAL(vm->vfront_porch, dispc.feat->fp_start, 8) | +		   FLD_VAL(vm->vback_porch, dispc.feat->bp_start, 20);  	dispc_write_reg(DISPC_TIMING_H(channel), timing_h);  	dispc_write_reg(DISPC_TIMING_V(channel), timing_v); -	switch (vsync_level) { -	case OMAPDSS_SIG_ACTIVE_LOW: -		vs = true; -		break; -	case OMAPDSS_SIG_ACTIVE_HIGH: +	if (vm->flags & DISPLAY_FLAGS_VSYNC_HIGH)  		vs = false; -		break; -	default: -		BUG(); -	} +	else +		vs = true; -	switch (hsync_level) { -	case OMAPDSS_SIG_ACTIVE_LOW: -		hs = true; -		break; -	case OMAPDSS_SIG_ACTIVE_HIGH: +	if (vm->flags & DISPLAY_FLAGS_HSYNC_HIGH)  		hs = false; -		break; -	default: -		BUG(); -	} +	else +		hs = true; -	switch (de_level) { -	case OMAPDSS_SIG_ACTIVE_LOW: -		de = true; -		break; -	case OMAPDSS_SIG_ACTIVE_HIGH: +	if (vm->flags & DISPLAY_FLAGS_DE_HIGH)  		de = false; -		break; -	default: -		BUG(); -	} +	else +		de = true; -	switch (data_pclk_edge) { -	case OMAPDSS_DRIVE_SIG_RISING_EDGE: +	if (vm->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE)  		ipc = false; -		break; -	case OMAPDSS_DRIVE_SIG_FALLING_EDGE: +	else  		ipc = true; -		break; -	default: -		BUG(); -	}  	/* always use the 'rf' setting */  	onoff = true; -	switch (sync_pclk_edge) { -	case OMAPDSS_DRIVE_SIG_FALLING_EDGE: -		rf = false; -		break; -	case OMAPDSS_DRIVE_SIG_RISING_EDGE: +	if (vm->flags & DISPLAY_FLAGS_SYNC_POSEDGE)  		rf = true; -		break; -	default: -		BUG(); -	} +	else +		rf = false;  	l = FLD_VAL(onoff, 17, 17) |  		FLD_VAL(rf, 16, 16) | @@ -3253,13 +3219,13 @@ static void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw,  /* change name to mode? */  void dispc_mgr_set_timings(enum omap_channel channel, -		const struct omap_video_timings *timings) +			   const struct videomode *vm)  {  	unsigned xtot, ytot;  	unsigned long ht, vt; -	struct omap_video_timings t = *timings; +	struct videomode t = *vm; -	DSSDBG("channel %d xres %u yres %u\n", channel, t.x_res, t.y_res); +	DSSDBG("channel %d xres %u yres %u\n", channel, t.hactive, t.vactive);  	if (!dispc_mgr_timings_ok(channel, &t)) {  		BUG(); @@ -3267,34 +3233,37 @@ void dispc_mgr_set_timings(enum omap_channel channel,  	}  	if (dss_mgr_is_lcd(channel)) { -		_dispc_mgr_set_lcd_timings(channel, t.hsw, t.hfp, t.hbp, t.vsw, -				t.vfp, t.vbp, t.vsync_level, t.hsync_level, -				t.data_pclk_edge, t.de_level, t.sync_pclk_edge); +		_dispc_mgr_set_lcd_timings(channel, &t); -		xtot = t.x_res + t.hfp + t.hsw + t.hbp; -		ytot = t.y_res + t.vfp + t.vsw + t.vbp; +		xtot = t.hactive + t.hfront_porch + t.hsync_len + t.hback_porch; +		ytot = t.vactive + t.vfront_porch + t.vsync_len + t.vback_porch; -		ht = timings->pixelclock / xtot; -		vt = timings->pixelclock / xtot / ytot; +		ht = vm->pixelclock / xtot; +		vt = vm->pixelclock / xtot / ytot; -		DSSDBG("pck %u\n", timings->pixelclock); -		DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", -			t.hsw, t.hfp, t.hbp, t.vsw, t.vfp, t.vbp); +		DSSDBG("pck %lu\n", vm->pixelclock); +		DSSDBG("hsync_len %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", +			t.hsync_len, t.hfront_porch, t.hback_porch, +			t.vsync_len, t.vfront_porch, t.vback_porch);  		DSSDBG("vsync_level %d hsync_level %d data_pclk_edge %d de_level %d sync_pclk_edge %d\n", -			t.vsync_level, t.hsync_level, t.data_pclk_edge, -			t.de_level, t.sync_pclk_edge); +			!!(t.flags & DISPLAY_FLAGS_VSYNC_HIGH), +			!!(t.flags & DISPLAY_FLAGS_HSYNC_HIGH), +			!!(t.flags & DISPLAY_FLAGS_PIXDATA_POSEDGE), +			!!(t.flags & DISPLAY_FLAGS_DE_HIGH), +			!!(t.flags & DISPLAY_FLAGS_SYNC_POSEDGE));  		DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt);  	} else { -		if (t.interlace) -			t.y_res /= 2; +		if (t.flags & DISPLAY_FLAGS_INTERLACED) +			t.vactive /= 2;  		if (dispc.feat->supports_double_pixel) -			REG_FLD_MOD(DISPC_CONTROL, t.double_pixel ? 1 : 0, -				19, 17); +			REG_FLD_MOD(DISPC_CONTROL, +				    !!(t.flags & DISPLAY_FLAGS_DOUBLECLK), +				    19, 17);  	} -	dispc_mgr_set_size(channel, t.x_res, t.y_res); +	dispc_mgr_set_size(channel, t.hactive, t.vactive);  }  EXPORT_SYMBOL(dispc_mgr_set_timings); @@ -4214,23 +4183,20 @@ EXPORT_SYMBOL(dispc_free_irq);   */  static const struct dispc_errata_i734_data { -	struct omap_video_timings timings; +	struct videomode vm;  	struct omap_overlay_info ovli;  	struct omap_overlay_manager_info mgri;  	struct dss_lcd_mgr_config lcd_conf;  } i734 = { -	.timings = { -		.x_res = 8, .y_res = 1, +	.vm = { +		.hactive = 8, .vactive = 1,  		.pixelclock = 16000000, -		.hsw = 8, .hfp = 4, .hbp = 4, -		.vsw = 1, .vfp = 1, .vbp = 1, -		.vsync_level = OMAPDSS_SIG_ACTIVE_LOW, -		.hsync_level = OMAPDSS_SIG_ACTIVE_LOW, -		.interlace = false, -		.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE, -		.de_level = OMAPDSS_SIG_ACTIVE_HIGH, -		.sync_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE, -		.double_pixel = false, +		.hsync_len = 8, .hfront_porch = 4, .hback_porch = 4, +		.vsync_len = 1, .vfront_porch = 1, .vback_porch = 1, + +		.flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | +			 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_SYNC_POSEDGE | +			 DISPLAY_FLAGS_PIXDATA_POSEDGE,  	},  	.ovli = {  		.screen_width = 1, @@ -4320,7 +4286,7 @@ static void dispc_errata_i734_wa(void)  	/* Setup and enable GFX plane */  	dispc_ovl_set_channel_out(OMAP_DSS_GFX, OMAP_DSS_CHANNEL_LCD); -	dispc_ovl_setup(OMAP_DSS_GFX, &ovli, false, &i734.timings, false); +	dispc_ovl_setup(OMAP_DSS_GFX, &ovli, false, &i734.vm, false);  	dispc_ovl_enable(OMAP_DSS_GFX, true);  	/* Set up and enable display manager for LCD1 */ @@ -4328,7 +4294,7 @@ static void dispc_errata_i734_wa(void)  	dispc_calc_clock_rates(dss_get_dispc_clk_rate(),  			       &lcd_conf.clock_info);  	dispc_mgr_set_lcd_config(OMAP_DSS_CHANNEL_LCD, &lcd_conf); -	dispc_mgr_set_timings(OMAP_DSS_CHANNEL_LCD, &i734.timings); +	dispc_mgr_set_timings(OMAP_DSS_CHANNEL_LCD, &i734.vm);  	dispc_clear_irqstatus(framedone_irq); diff --git a/drivers/gpu/drm/omapdrm/dss/display.c b/drivers/gpu/drm/omapdrm/dss/display.c index 8dcdd7cf9937..425a5a8dff8b 100644 --- a/drivers/gpu/drm/omapdrm/dss/display.c +++ b/drivers/gpu/drm/omapdrm/dss/display.c @@ -35,8 +35,8 @@  void omapdss_default_get_resolution(struct omap_dss_device *dssdev,  			u16 *xres, u16 *yres)  { -	*xres = dssdev->panel.timings.x_res; -	*yres = dssdev->panel.timings.y_res; +	*xres = dssdev->panel.vm.hactive; +	*yres = dssdev->panel.vm.vactive;  }  EXPORT_SYMBOL(omapdss_default_get_resolution); @@ -72,9 +72,9 @@ int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev)  EXPORT_SYMBOL(omapdss_default_get_recommended_bpp);  void omapdss_default_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +				 struct videomode *vm)  { -	*timings = dssdev->panel.timings; +	*vm = dssdev->panel.vm;  }  EXPORT_SYMBOL(omapdss_default_get_timings); @@ -217,73 +217,3 @@ struct omap_dss_device *omap_dss_find_device(void *data,  	return NULL;  }  EXPORT_SYMBOL(omap_dss_find_device); - -void videomode_to_omap_video_timings(const struct videomode *vm, -		struct omap_video_timings *ovt) -{ -	memset(ovt, 0, sizeof(*ovt)); - -	ovt->pixelclock = vm->pixelclock; -	ovt->x_res = vm->hactive; -	ovt->hbp = vm->hback_porch; -	ovt->hfp = vm->hfront_porch; -	ovt->hsw = vm->hsync_len; -	ovt->y_res = vm->vactive; -	ovt->vbp = vm->vback_porch; -	ovt->vfp = vm->vfront_porch; -	ovt->vsw = vm->vsync_len; - -	ovt->vsync_level = vm->flags & DISPLAY_FLAGS_VSYNC_HIGH ? -		OMAPDSS_SIG_ACTIVE_HIGH : -		OMAPDSS_SIG_ACTIVE_LOW; -	ovt->hsync_level = vm->flags & DISPLAY_FLAGS_HSYNC_HIGH ? -		OMAPDSS_SIG_ACTIVE_HIGH : -		OMAPDSS_SIG_ACTIVE_LOW; -	ovt->de_level = vm->flags & DISPLAY_FLAGS_DE_HIGH ? -		OMAPDSS_SIG_ACTIVE_HIGH : -		OMAPDSS_SIG_ACTIVE_LOW; -	ovt->data_pclk_edge = vm->flags & DISPLAY_FLAGS_PIXDATA_POSEDGE ? -		OMAPDSS_DRIVE_SIG_RISING_EDGE : -		OMAPDSS_DRIVE_SIG_FALLING_EDGE; - -	ovt->sync_pclk_edge = ovt->data_pclk_edge; -} -EXPORT_SYMBOL(videomode_to_omap_video_timings); - -void omap_video_timings_to_videomode(const struct omap_video_timings *ovt, -		struct videomode *vm) -{ -	memset(vm, 0, sizeof(*vm)); - -	vm->pixelclock = ovt->pixelclock; - -	vm->hactive = ovt->x_res; -	vm->hback_porch = ovt->hbp; -	vm->hfront_porch = ovt->hfp; -	vm->hsync_len = ovt->hsw; -	vm->vactive = ovt->y_res; -	vm->vback_porch = ovt->vbp; -	vm->vfront_porch = ovt->vfp; -	vm->vsync_len = ovt->vsw; - -	if (ovt->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH) -		vm->flags |= DISPLAY_FLAGS_HSYNC_HIGH; -	else -		vm->flags |= DISPLAY_FLAGS_HSYNC_LOW; - -	if (ovt->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH) -		vm->flags |= DISPLAY_FLAGS_VSYNC_HIGH; -	else -		vm->flags |= DISPLAY_FLAGS_VSYNC_LOW; - -	if (ovt->de_level == OMAPDSS_SIG_ACTIVE_HIGH) -		vm->flags |= DISPLAY_FLAGS_DE_HIGH; -	else -		vm->flags |= DISPLAY_FLAGS_DE_LOW; - -	if (ovt->data_pclk_edge == OMAPDSS_DRIVE_SIG_RISING_EDGE) -		vm->flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; -	else -		vm->flags |= DISPLAY_FLAGS_PIXDATA_NEGEDGE; -} -EXPORT_SYMBOL(omap_video_timings_to_videomode); diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c index b268295b76cf..e75162d26ac0 100644 --- a/drivers/gpu/drm/omapdrm/dss/dpi.c +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c @@ -47,7 +47,7 @@ struct dpi_data {  	struct mutex lock; -	struct omap_video_timings timings; +	struct videomode vm;  	struct dss_lcd_mgr_config mgr_config;  	int data_lines; @@ -333,31 +333,31 @@ static int dpi_set_mode(struct dpi_data *dpi)  {  	struct omap_dss_device *out = &dpi->output;  	enum omap_channel channel = out->dispc_channel; -	struct omap_video_timings *t = &dpi->timings; +	struct videomode *vm = &dpi->vm;  	int lck_div = 0, pck_div = 0;  	unsigned long fck = 0;  	unsigned long pck;  	int r = 0;  	if (dpi->pll) -		r = dpi_set_pll_clk(dpi, channel, t->pixelclock, &fck, +		r = dpi_set_pll_clk(dpi, channel, vm->pixelclock, &fck,  				&lck_div, &pck_div);  	else -		r = dpi_set_dispc_clk(dpi, t->pixelclock, &fck, +		r = dpi_set_dispc_clk(dpi, vm->pixelclock, &fck,  				&lck_div, &pck_div);  	if (r)  		return r;  	pck = fck / lck_div / pck_div; -	if (pck != t->pixelclock) { -		DSSWARN("Could not find exact pixel clock. Requested %d Hz, got %lu Hz\n", -			t->pixelclock, pck); +	if (pck != vm->pixelclock) { +		DSSWARN("Could not find exact pixel clock. Requested %lu Hz, got %lu Hz\n", +			vm->pixelclock, pck); -		t->pixelclock = pck; +		vm->pixelclock = pck;  	} -	dss_mgr_set_timings(channel, t); +	dss_mgr_set_timings(channel, vm);  	return 0;  } @@ -476,7 +476,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev)  }  static void dpi_set_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			    struct videomode *vm)  {  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); @@ -484,25 +484,25 @@ static void dpi_set_timings(struct omap_dss_device *dssdev,  	mutex_lock(&dpi->lock); -	dpi->timings = *timings; +	dpi->vm = *vm;  	mutex_unlock(&dpi->lock);  }  static void dpi_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			    struct videomode *vm)  {  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);  	mutex_lock(&dpi->lock); -	*timings = dpi->timings; +	*vm = dpi->vm;  	mutex_unlock(&dpi->lock);  }  static int dpi_check_timings(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings) +			     struct videomode *vm)  {  	struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev);  	enum omap_channel channel = dpi->output.dispc_channel; @@ -512,23 +512,23 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,  	struct dpi_clk_calc_ctx ctx;  	bool ok; -	if (timings->x_res % 8 != 0) +	if (vm->hactive % 8 != 0)  		return -EINVAL; -	if (!dispc_mgr_timings_ok(channel, timings)) +	if (!dispc_mgr_timings_ok(channel, vm))  		return -EINVAL; -	if (timings->pixelclock == 0) +	if (vm->pixelclock == 0)  		return -EINVAL;  	if (dpi->pll) { -		ok = dpi_pll_clk_calc(dpi, timings->pixelclock, &ctx); +		ok = dpi_pll_clk_calc(dpi, vm->pixelclock, &ctx);  		if (!ok)  			return -EINVAL;  		fck = ctx.pll_cinfo.clkout[ctx.clkout_idx];  	} else { -		ok = dpi_dss_clk_calc(timings->pixelclock, &ctx); +		ok = dpi_dss_clk_calc(vm->pixelclock, &ctx);  		if (!ok)  			return -EINVAL; @@ -540,7 +540,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,  	pck = fck / lck_div / pck_div; -	timings->pixelclock = pck; +	vm->pixelclock = pck;  	return 0;  } diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c index e1be5e795cd8..f060bda31235 100644 --- a/drivers/gpu/drm/omapdrm/dss/dsi.c +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c @@ -289,7 +289,7 @@ struct dsi_clk_calc_ctx {  	struct dss_pll_clock_info dsi_cinfo;  	struct dispc_clock_info dispc_cinfo; -	struct omap_video_timings dispc_vm; +	struct videomode vm;  	struct omap_dss_dsi_videomode_timings dsi_vm;  }; @@ -383,7 +383,7 @@ struct dsi_data {  	unsigned scp_clk_refcount;  	struct dss_lcd_mgr_config mgr_config; -	struct omap_video_timings timings; +	struct videomode vm;  	enum omap_dss_dsi_pixel_format pix_fmt;  	enum omap_dss_dsi_mode mode;  	struct omap_dss_dsi_videomode_timings vm_timings; @@ -3321,12 +3321,12 @@ static void dsi_config_vp_num_line_buffers(struct platform_device *dsidev)  	if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {  		int bpp = dsi_get_pixel_size(dsi->pix_fmt); -		struct omap_video_timings *timings = &dsi->timings; +		struct videomode *vm = &dsi->vm;  		/*  		 * Don't use line buffers if width is greater than the video  		 * port's line buffer size  		 */ -		if (dsi->line_buffer_size <= timings->x_res * bpp / 8) +		if (dsi->line_buffer_size <= vm->hactive * bpp / 8)  			num_line_buffers = 0;  		else  			num_line_buffers = 2; @@ -3453,7 +3453,7 @@ static void dsi_config_cmd_mode_interleaving(struct platform_device *dsidev)  	int ddr_clk_pre, ddr_clk_post, enter_hs_mode_lat, exit_hs_mode_lat;  	int tclk_trail, ths_exit, exiths_clk;  	bool ddr_alwon; -	struct omap_video_timings *timings = &dsi->timings; +	struct videomode *vm = &dsi->vm;  	int bpp = dsi_get_pixel_size(dsi->pix_fmt);  	int ndl = dsi->num_lanes_used - 1;  	int dsi_fclk_hsdiv = dsi->user_dsi_cinfo.mX[HSDIV_DSI] + 1; @@ -3494,7 +3494,7 @@ static void dsi_config_cmd_mode_interleaving(struct platform_device *dsidev)  	exiths_clk = ths_exit + tclk_trail; -	width_bytes = DIV_ROUND_UP(timings->x_res * bpp, 8); +	width_bytes = DIV_ROUND_UP(vm->hactive * bpp, 8);  	bllp = hbp + hfp + hsa + DIV_ROUND_UP(width_bytes + 6, ndl);  	if (!hsa_blanking_mode) { @@ -3705,7 +3705,7 @@ static void dsi_proto_timings(struct platform_device *dsidev)  		int vbp = dsi->vm_timings.vbp;  		int window_sync = dsi->vm_timings.window_sync;  		bool hsync_end; -		struct omap_video_timings *timings = &dsi->timings; +		struct videomode *vm = &dsi->vm;  		int bpp = dsi_get_pixel_size(dsi->pix_fmt);  		int tl, t_he, width_bytes; @@ -3713,7 +3713,7 @@ static void dsi_proto_timings(struct platform_device *dsidev)  		t_he = hsync_end ?  			((hsa == 0 && ndl == 3) ? 1 : DIV_ROUND_UP(4, ndl)) : 0; -		width_bytes = DIV_ROUND_UP(timings->x_res * bpp, 8); +		width_bytes = DIV_ROUND_UP(vm->hactive * bpp, 8);  		/* TL = t_HS + HSA + t_HE + HFP + ceil((WC + 6) / NDL) + HBP */  		tl = DIV_ROUND_UP(4, ndl) + (hsync_end ? hsa : 0) + t_he + hfp + @@ -3722,7 +3722,7 @@ static void dsi_proto_timings(struct platform_device *dsidev)  		DSSDBG("HBP: %d, HFP: %d, HSA: %d, TL: %d TXBYTECLKHS\n", hbp,  			hfp, hsync_end ? hsa : 0, tl);  		DSSDBG("VBP: %d, VFP: %d, VSA: %d, VACT: %d lines\n", vbp, vfp, -			vsa, timings->y_res); +			vsa, vm->vactive);  		r = dsi_read_reg(dsidev, DSI_VM_TIMING1);  		r = FLD_MOD(r, hbp, 11, 0);	/* HBP */ @@ -3738,7 +3738,7 @@ static void dsi_proto_timings(struct platform_device *dsidev)  		dsi_write_reg(dsidev, DSI_VM_TIMING2, r);  		r = dsi_read_reg(dsidev, DSI_VM_TIMING3); -		r = FLD_MOD(r, timings->y_res, 14, 0);	/* VACT */ +		r = FLD_MOD(r, vm->vactive, 14, 0);	/* VACT */  		r = FLD_MOD(r, tl, 31, 16);		/* TL */  		dsi_write_reg(dsidev, DSI_VM_TIMING3, r);  	} @@ -3856,7 +3856,7 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)  		/* MODE, 1 = video mode */  		REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 4, 4); -		word_count = DIV_ROUND_UP(dsi->timings.x_res * bpp, 8); +		word_count = DIV_ROUND_UP(dsi->vm.hactive * bpp, 8);  		dsi_vc_write_long_header(dsidev, channel, data_type,  				word_count, 0); @@ -3918,8 +3918,8 @@ static void dsi_update_screen_dispc(struct platform_device *dsidev)  	int r;  	const unsigned channel = dsi->update_channel;  	const unsigned line_buf_size = dsi->line_buffer_size; -	u16 w = dsi->timings.x_res; -	u16 h = dsi->timings.y_res; +	u16 w = dsi->vm.hactive; +	u16 h = dsi->vm.vactive;  	DSSDBG("dsi_update_screen_dispc(%dx%d)\n", w, h); @@ -3969,7 +3969,7 @@ static void dsi_update_screen_dispc(struct platform_device *dsidev)  		msecs_to_jiffies(250));  	BUG_ON(r == 0); -	dss_mgr_set_timings(dispc_channel, &dsi->timings); +	dss_mgr_set_timings(dispc_channel, &dsi->vm);  	dss_mgr_start_update(dispc_channel); @@ -4056,8 +4056,8 @@ static int dsi_update(struct omap_dss_device *dssdev, int channel,  	dsi->framedone_callback = callback;  	dsi->framedone_data = data; -	dw = dsi->timings.x_res; -	dh = dsi->timings.y_res; +	dw = dsi->vm.hactive; +	dh = dsi->vm.vactive;  #ifdef DSI_PERF_MEASURE  	dsi->update_bytes = dw * dh * @@ -4120,16 +4120,21 @@ static int dsi_display_init_dispc(struct platform_device *dsidev,  	/*  	 * override interlace, logic level and edge related parameters in -	 * omap_video_timings with default values +	 * videomode with default values  	 */ -	dsi->timings.interlace = false; -	dsi->timings.hsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	dsi->timings.vsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	dsi->timings.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; -	dsi->timings.de_level = OMAPDSS_SIG_ACTIVE_HIGH; -	dsi->timings.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE; - -	dss_mgr_set_timings(channel, &dsi->timings); +	dsi->vm.flags &= ~DISPLAY_FLAGS_INTERLACED; +	dsi->vm.flags &= ~DISPLAY_FLAGS_HSYNC_LOW; +	dsi->vm.flags |= DISPLAY_FLAGS_HSYNC_HIGH; +	dsi->vm.flags &= ~DISPLAY_FLAGS_VSYNC_LOW; +	dsi->vm.flags |= DISPLAY_FLAGS_VSYNC_HIGH; +	dsi->vm.flags &= ~DISPLAY_FLAGS_PIXDATA_NEGEDGE; +	dsi->vm.flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; +	dsi->vm.flags &= ~DISPLAY_FLAGS_DE_LOW; +	dsi->vm.flags |= DISPLAY_FLAGS_DE_HIGH; +	dsi->vm.flags &= ~DISPLAY_FLAGS_SYNC_POSEDGE; +	dsi->vm.flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; + +	dss_mgr_set_timings(channel, &dsi->vm);  	r = dsi_configure_dispc_clocks(dsidev);  	if (r) @@ -4331,7 +4336,7 @@ static void print_dsi_vm(const char *str,  	wc = DIV_ROUND_UP(t->hact * t->bitspp, 8);  	pps = DIV_ROUND_UP(wc + 6, t->ndl); /* pixel packet size */ -	bl = t->hss + t->hsa + t->hse + t->hbp + t->hfp; +	bl = t->hss + t->hsa + t->hse + t->hbp + t->hfront_porch;  	tot = bl + pps;  #define TO_DSI_T(x) ((u32)div64_u64((u64)x * 1000000000llu, byteclk)) @@ -4340,14 +4345,14 @@ static void print_dsi_vm(const char *str,  			"%u/%u/%u/%u/%u/%u = %u + %u = %u\n",  			str,  			byteclk, -			t->hss, t->hsa, t->hse, t->hbp, pps, t->hfp, +			t->hss, t->hsa, t->hse, t->hbp, pps, t->hfront_porch,  			bl, pps, tot,  			TO_DSI_T(t->hss),  			TO_DSI_T(t->hsa),  			TO_DSI_T(t->hse),  			TO_DSI_T(t->hbp),  			TO_DSI_T(pps), -			TO_DSI_T(t->hfp), +			TO_DSI_T(t->hfront_porch),  			TO_DSI_T(bl),  			TO_DSI_T(pps), @@ -4356,13 +4361,13 @@ static void print_dsi_vm(const char *str,  #undef TO_DSI_T  } -static void print_dispc_vm(const char *str, const struct omap_video_timings *t) +static void print_dispc_vm(const char *str, const struct videomode *vm)  { -	unsigned long pck = t->pixelclock; +	unsigned long pck = vm->pixelclock;  	int hact, bl, tot; -	hact = t->x_res; -	bl = t->hsw + t->hbp + t->hfp; +	hact = vm->hactive; +	bl = vm->hsync_len + vm->hbp + vm->hfront_porch;  	tot = hact + bl;  #define TO_DISPC_T(x) ((u32)div64_u64((u64)x * 1000000000llu, pck)) @@ -4371,12 +4376,12 @@ static void print_dispc_vm(const char *str, const struct omap_video_timings *t)  			"%u/%u/%u/%u = %u + %u = %u\n",  			str,  			pck, -			t->hsw, t->hbp, hact, t->hfp, +			vm->hsync_len, vm->hbp, hact, vm->hfront_porch,  			bl, hact, tot, -			TO_DISPC_T(t->hsw), -			TO_DISPC_T(t->hbp), +			TO_DISPC_T(vm->hsync_len), +			TO_DISPC_T(vm->hbp),  			TO_DISPC_T(hact), -			TO_DISPC_T(t->hfp), +			TO_DISPC_T(vm->hfront_porch),  			TO_DISPC_T(bl),  			TO_DISPC_T(hact),  			TO_DISPC_T(tot)); @@ -4387,7 +4392,7 @@ static void print_dispc_vm(const char *str, const struct omap_video_timings *t)  static void print_dsi_dispc_vm(const char *str,  		const struct omap_dss_dsi_videomode_timings *t)  { -	struct omap_video_timings vm = { 0 }; +	struct videomode vm = { 0 };  	unsigned long byteclk = t->hsclk / 4;  	unsigned long pck;  	u64 dsi_tput; @@ -4396,13 +4401,13 @@ static void print_dsi_dispc_vm(const char *str,  	dsi_tput = (u64)byteclk * t->ndl * 8;  	pck = (u32)div64_u64(dsi_tput, t->bitspp);  	dsi_hact = DIV_ROUND_UP(DIV_ROUND_UP(t->hact * t->bitspp, 8) + 6, t->ndl); -	dsi_htot = t->hss + t->hsa + t->hse + t->hbp + dsi_hact + t->hfp; +	dsi_htot = t->hss + t->hsa + t->hse + t->hbp + dsi_hact + t->hfront_porch;  	vm.pixelclock = pck; -	vm.hsw = div64_u64((u64)(t->hsa + t->hse) * pck, byteclk); +	vm.hsync_len = div64_u64((u64)(t->hsa + t->hse) * pck, byteclk);  	vm.hbp = div64_u64((u64)t->hbp * pck, byteclk); -	vm.hfp = div64_u64((u64)t->hfp * pck, byteclk); -	vm.x_res = t->hact; +	vm.hfront_porch = div64_u64((u64)t->hfront_porch * pck, byteclk); +	vm.hactive = t->hact;  	print_dispc_vm(str, &vm);  } @@ -4412,19 +4417,19 @@ static bool dsi_cm_calc_dispc_cb(int lckd, int pckd, unsigned long lck,  		unsigned long pck, void *data)  {  	struct dsi_clk_calc_ctx *ctx = data; -	struct omap_video_timings *t = &ctx->dispc_vm; +	struct videomode *vm = &ctx->vm;  	ctx->dispc_cinfo.lck_div = lckd;  	ctx->dispc_cinfo.pck_div = pckd;  	ctx->dispc_cinfo.lck = lck;  	ctx->dispc_cinfo.pck = pck; -	*t = *ctx->config->timings; -	t->pixelclock = pck; -	t->x_res = ctx->config->timings->x_res; -	t->y_res = ctx->config->timings->y_res; -	t->hsw = t->hfp = t->hbp = t->vsw = 1; -	t->vfp = t->vbp = 0; +	*vm = *ctx->config->vm; +	vm->pixelclock = pck; +	vm->hactive = ctx->config->vm->hactive; +	vm->vactive = ctx->config->vm->vactive; +	vm->hsync_len = vm->hfront_porch = vm->hback_porch = vm->vsync_len = 1; +	vm->vfront_porch = vm->vback_porch = 0;  	return true;  } @@ -4475,7 +4480,7 @@ static bool dsi_cm_calc(struct dsi_data *dsi,  	 * especially as we go to LP between each pixel packet due to HW  	 * "feature". So let's just estimate very roughly and multiply by 1.5.  	 */ -	pck = cfg->timings->pixelclock; +	pck = cfg->vm->pixelclock;  	pck = pck * 3 / 2;  	txbyteclk = pck * bitspp / 8 / ndl; @@ -4510,14 +4515,14 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	int dispc_htot, dispc_hbl; /* pixels */  	int dsi_htot, dsi_hact, dsi_hbl, hss, hse; /* byteclks */  	int hfp, hsa, hbp; -	const struct omap_video_timings *req_vm; -	struct omap_video_timings *dispc_vm; +	const struct videomode *req_vm; +	struct videomode *dispc_vm;  	struct omap_dss_dsi_videomode_timings *dsi_vm;  	u64 dsi_tput, dispc_tput;  	dsi_tput = (u64)byteclk * ndl * 8; -	req_vm = cfg->timings; +	req_vm = cfg->vm;  	req_pck_min = ctx->req_pck_min;  	req_pck_max = ctx->req_pck_max;  	req_pck_nom = ctx->req_pck_nom; @@ -4525,9 +4530,10 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	dispc_pck = ctx->dispc_cinfo.pck;  	dispc_tput = (u64)dispc_pck * bitspp; -	xres = req_vm->x_res; +	xres = req_vm->hactive; -	panel_hbl = req_vm->hfp + req_vm->hbp + req_vm->hsw; +	panel_hbl = req_vm->hfront_porch + req_vm->hback_porch + +		    req_vm->hsync_len;  	panel_htot = xres + panel_hbl;  	dsi_hact = DIV_ROUND_UP(DIV_ROUND_UP(xres * bitspp, 8) + 6, ndl); @@ -4557,7 +4563,7 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	hss = DIV_ROUND_UP(4, ndl);  	if (cfg->trans_mode == OMAP_DSS_DSI_PULSE_MODE) { -		if (ndl == 3 && req_vm->hsw == 0) +		if (ndl == 3 && req_vm->hsync_len == 0)  			hse = 1;  		else  			hse = DIV_ROUND_UP(4, ndl); @@ -4596,14 +4602,14 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	if (cfg->trans_mode != OMAP_DSS_DSI_PULSE_MODE) {  		hsa = 0; -	} else if (ndl == 3 && req_vm->hsw == 0) { +	} else if (ndl == 3 && req_vm->hsync_len == 0) {  		hsa = 0;  	} else { -		hsa = div64_u64((u64)req_vm->hsw * byteclk, req_pck_nom); +		hsa = div64_u64((u64)req_vm->hsync_len * byteclk, req_pck_nom);  		hsa = max(hsa - hse, 1);  	} -	hbp = div64_u64((u64)req_vm->hbp * byteclk, req_pck_nom); +	hbp = div64_u64((u64)req_vm->hback_porch * byteclk, req_pck_nom);  	hbp = max(hbp, 1);  	hfp = dsi_hbl - (hss + hsa + hse + hbp); @@ -4633,10 +4639,10 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	dsi_vm->hact = xres;  	dsi_vm->hfp = hfp; -	dsi_vm->vsa = req_vm->vsw; -	dsi_vm->vbp = req_vm->vbp; -	dsi_vm->vact = req_vm->y_res; -	dsi_vm->vfp = req_vm->vfp; +	dsi_vm->vsa = req_vm->vsync_len; +	dsi_vm->vbp = req_vm->vback_porch; +	dsi_vm->vact = req_vm->vactive; +	dsi_vm->vfp = req_vm->vfront_porch;  	dsi_vm->trans_mode = cfg->trans_mode; @@ -4650,19 +4656,19 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	/* setup DISPC videomode */ -	dispc_vm = &ctx->dispc_vm; +	dispc_vm = &ctx->vm;  	*dispc_vm = *req_vm;  	dispc_vm->pixelclock = dispc_pck;  	if (cfg->trans_mode == OMAP_DSS_DSI_PULSE_MODE) { -		hsa = div64_u64((u64)req_vm->hsw * dispc_pck, +		hsa = div64_u64((u64)req_vm->hsync_len * dispc_pck,  				req_pck_nom);  		hsa = max(hsa, 1);  	} else {  		hsa = 1;  	} -	hbp = div64_u64((u64)req_vm->hbp * dispc_pck, req_pck_nom); +	hbp = div64_u64((u64)req_vm->hback_porch * dispc_pck, req_pck_nom);  	hbp = max(hbp, 1);  	hfp = dispc_hbl - hsa - hbp; @@ -4685,9 +4691,9 @@ static bool dsi_vm_calc_blanking(struct dsi_clk_calc_ctx *ctx)  	if (hfp < 1)  		return false; -	dispc_vm->hfp = hfp; -	dispc_vm->hsw = hsa; -	dispc_vm->hbp = hbp; +	dispc_vm->hfront_porch = hfp; +	dispc_vm->hsync_len = hsa; +	dispc_vm->hback_porch = hbp;  	return true;  } @@ -4707,9 +4713,9 @@ static bool dsi_vm_calc_dispc_cb(int lckd, int pckd, unsigned long lck,  		return false;  #ifdef PRINT_VERBOSE_VM_TIMINGS -	print_dispc_vm("dispc", &ctx->dispc_vm); +	print_dispc_vm("dispc", &ctx->vm);  	print_dsi_vm("dsi  ", &ctx->dsi_vm); -	print_dispc_vm("req  ", ctx->config->timings); +	print_dispc_vm("req  ", ctx->config->vm);  	print_dsi_dispc_vm("act  ", &ctx->dsi_vm);  #endif @@ -4758,7 +4764,7 @@ static bool dsi_vm_calc(struct dsi_data *dsi,  		const struct omap_dss_dsi_config *cfg,  		struct dsi_clk_calc_ctx *ctx)  { -	const struct omap_video_timings *t = cfg->timings; +	const struct videomode *vm = cfg->vm;  	unsigned long clkin;  	unsigned long pll_min;  	unsigned long pll_max; @@ -4774,9 +4780,9 @@ static bool dsi_vm_calc(struct dsi_data *dsi,  	ctx->config = cfg;  	/* these limits should come from the panel driver */ -	ctx->req_pck_min = t->pixelclock - 1000; -	ctx->req_pck_nom = t->pixelclock; -	ctx->req_pck_max = t->pixelclock + 1000; +	ctx->req_pck_min = vm->pixelclock - 1000; +	ctx->req_pck_nom = vm->pixelclock; +	ctx->req_pck_max = vm->pixelclock + 1000;  	byteclk_min = div64_u64((u64)ctx->req_pck_min * bitspp, ndl * 8);  	pll_min = max(cfg->hs_clk_min * 4, byteclk_min * 4 * 4); @@ -4833,7 +4839,7 @@ static int dsi_set_config(struct omap_dss_device *dssdev,  	dsi->user_dsi_cinfo = ctx.dsi_cinfo;  	dsi->user_dispc_cinfo = ctx.dispc_cinfo; -	dsi->timings = ctx.dispc_vm; +	dsi->vm = ctx.vm;  	dsi->vm_timings = ctx.dsi_vm;  	mutex_unlock(&dsi->lock); @@ -5342,7 +5348,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)  	dsi->phy_base = devm_ioremap(&dsidev->dev, res->start,  		resource_size(res)); -	if (!dsi->proto_base) { +	if (!dsi->phy_base) {  		DSSERR("can't ioremap DSI PHY\n");  		return -ENOMEM;  	} @@ -5362,7 +5368,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)  	dsi->pll_base = devm_ioremap(&dsidev->dev, res->start,  		resource_size(res)); -	if (!dsi->proto_base) { +	if (!dsi->pll_base) {  		DSSERR("can't ioremap DSI PLL\n");  		return -ENOMEM;  	} diff --git a/drivers/gpu/drm/omapdrm/dss/dss.h b/drivers/gpu/drm/omapdrm/dss/dss.h index 4fd06dc41cb3..56493b290731 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.h +++ b/drivers/gpu/drm/omapdrm/dss/dss.h @@ -366,8 +366,7 @@ bool dispc_div_calc(unsigned long dispc,  		unsigned long pck_min, unsigned long pck_max,  		dispc_div_calc_func func, void *data); -bool dispc_mgr_timings_ok(enum omap_channel channel, -		const struct omap_video_timings *timings); +bool dispc_mgr_timings_ok(enum omap_channel channel, const struct videomode *vm);  int dispc_calc_clock_rates(unsigned long dispc_fclk_rate,  		struct dispc_clock_info *cinfo); @@ -390,7 +389,7 @@ void dispc_wb_enable(bool enable);  bool dispc_wb_is_enabled(void);  void dispc_wb_set_channel_in(enum dss_writeback_channel channel);  int dispc_wb_setup(const struct omap_dss_writeback_info *wi, -		bool mem_to_mem, const struct omap_video_timings *timings); +		bool mem_to_mem, const struct videomode *vm);  /* VENC */  int venc_init_platform_driver(void) __init; diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi.h b/drivers/gpu/drm/omapdrm/dss/hdmi.h index 63e711545865..fb6cccd02374 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi.h +++ b/drivers/gpu/drm/omapdrm/dss/hdmi.h @@ -181,7 +181,7 @@ struct hdmi_video_format {  };  struct hdmi_config { -	struct omap_video_timings timings; +	struct videomode vm;  	struct hdmi_avi_infoframe infoframe;  	enum hdmi_core_hdmi_dvi hdmi_dvi_mode;  }; @@ -298,11 +298,11 @@ int hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val);  void hdmi_wp_video_config_format(struct hdmi_wp_data *wp,  		struct hdmi_video_format *video_fmt);  void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp, -		struct omap_video_timings *timings); +		struct videomode *vm);  void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, -		struct omap_video_timings *timings); +		struct videomode *vm);  void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt, -		struct omap_video_timings *timings, struct hdmi_config *param); +		struct videomode *vm, struct hdmi_config *param);  int hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp);  phys_addr_t hdmi_wp_get_audio_dma_addr(struct hdmi_wp_data *wp); diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c index cbd28dfdb86a..e7162c16de2e 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c @@ -155,7 +155,7 @@ static void hdmi_power_off_core(struct omap_dss_device *dssdev)  static int hdmi_power_on_full(struct omap_dss_device *dssdev)  {  	int r; -	struct omap_video_timings *p; +	struct videomode *vm;  	enum omap_channel channel = dssdev->dispc_channel;  	struct hdmi_wp_data *wp = &hdmi.wp;  	struct dss_pll_clock_info hdmi_cinfo = { 0 }; @@ -169,12 +169,13 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)  	hdmi_wp_clear_irqenable(wp, 0xffffffff);  	hdmi_wp_set_irqstatus(wp, 0xffffffff); -	p = &hdmi.cfg.timings; +	vm = &hdmi.cfg.vm; -	DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res); +	DSSDBG("hdmi_power_on hactive= %d vactive = %d\n", vm->hactive, +	       vm->vactive); -	pc = p->pixelclock; -	if (p->double_pixel) +	pc = vm->pixelclock; +	if (vm->flags & DISPLAY_FLAGS_DOUBLECLK)  		pc *= 2;  	/* DSS_HDMI_TCLK is bitclk / 10 */ @@ -209,7 +210,7 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)  	hdmi4_configure(&hdmi.core, &hdmi.wp, &hdmi.cfg);  	/* tv size */ -	dss_mgr_set_timings(channel, p); +	dss_mgr_set_timings(channel, vm);  	r = dss_mgr_enable(channel);  	if (r) @@ -255,30 +256,30 @@ static void hdmi_power_off_full(struct omap_dss_device *dssdev)  }  static int hdmi_display_check_timing(struct omap_dss_device *dssdev, -					struct omap_video_timings *timings) +				     struct videomode *vm)  { -	if (!dispc_mgr_timings_ok(dssdev->dispc_channel, timings)) +	if (!dispc_mgr_timings_ok(dssdev->dispc_channel, vm))  		return -EINVAL;  	return 0;  }  static void hdmi_display_set_timing(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +				    struct videomode *vm)  {  	mutex_lock(&hdmi.lock); -	hdmi.cfg.timings = *timings; +	hdmi.cfg.vm = *vm; -	dispc_set_tv_pclk(timings->pixelclock); +	dispc_set_tv_pclk(vm->pixelclock);  	mutex_unlock(&hdmi.lock);  }  static void hdmi_display_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +				     struct videomode *vm)  { -	*timings = hdmi.cfg.timings; +	*vm = hdmi.cfg.vm;  }  static void hdmi_dump_regs(struct seq_file *s) @@ -352,7 +353,7 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)  	if (hdmi.audio_configured) {  		r = hdmi4_audio_config(&hdmi.core, &hdmi.wp, &hdmi.audio_config, -				       hdmi.cfg.timings.pixelclock); +				       hdmi.cfg.vm.pixelclock);  		if (r) {  			DSSERR("Error restoring audio configuration: %d", r);  			hdmi.audio_abort_cb(&hdmi.pdev->dev); @@ -643,7 +644,7 @@ static int hdmi_audio_config(struct device *dev,  	}  	ret = hdmi4_audio_config(&hd->core, &hd->wp, dss_audio, -				 hd->cfg.timings.pixelclock); +				 hd->cfg.vm.pixelclock);  	if (!ret) {  		hd->audio_configured = true;  		hd->audio_config = *dss_audio; diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4_core.c b/drivers/gpu/drm/omapdrm/dss/hdmi4_core.c index ef3afe99e487..e05b7ac4f7dd 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi4_core.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4_core.c @@ -310,7 +310,7 @@ void hdmi4_configure(struct hdmi_core_data *core,  	struct hdmi_wp_data *wp, struct hdmi_config *cfg)  {  	/* HDMI */ -	struct omap_video_timings video_timing; +	struct videomode vm;  	struct hdmi_video_format video_format;  	/* HDMI core */  	struct hdmi_core_video_config v_core_cfg; @@ -318,16 +318,16 @@ void hdmi4_configure(struct hdmi_core_data *core,  	hdmi_core_init(&v_core_cfg); -	hdmi_wp_init_vid_fmt_timings(&video_format, &video_timing, cfg); +	hdmi_wp_init_vid_fmt_timings(&video_format, &vm, cfg); -	hdmi_wp_video_config_timing(wp, &video_timing); +	hdmi_wp_video_config_timing(wp, &vm);  	/* video config */  	video_format.packing_mode = HDMI_PACK_24b_RGB_YUV444_YUV422;  	hdmi_wp_video_config_format(wp, &video_format); -	hdmi_wp_video_config_interface(wp, &video_timing); +	hdmi_wp_video_config_interface(wp, &vm);  	/*  	 * configure core video part diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c index 0c0a5139a301..678dfb02764a 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c @@ -172,7 +172,7 @@ static void hdmi_power_off_core(struct omap_dss_device *dssdev)  static int hdmi_power_on_full(struct omap_dss_device *dssdev)  {  	int r; -	struct omap_video_timings *p; +	struct videomode *vm;  	enum omap_channel channel = dssdev->dispc_channel;  	struct dss_pll_clock_info hdmi_cinfo = { 0 };  	unsigned pc; @@ -181,12 +181,13 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)  	if (r)  		return r; -	p = &hdmi.cfg.timings; +	vm = &hdmi.cfg.vm; -	DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res); +	DSSDBG("hdmi_power_on hactive= %d vactive = %d\n", vm->hactive, +	       vm->vactive); -	pc = p->pixelclock; -	if (p->double_pixel) +	pc = vm->pixelclock; +	if (vm->flags & DISPLAY_FLAGS_DOUBLECLK)  		pc *= 2;  	/* DSS_HDMI_TCLK is bitclk / 10 */ @@ -226,7 +227,7 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)  	hdmi5_configure(&hdmi.core, &hdmi.wp, &hdmi.cfg);  	/* tv size */ -	dss_mgr_set_timings(channel, p); +	dss_mgr_set_timings(channel, vm);  	r = dss_mgr_enable(channel);  	if (r) @@ -272,30 +273,30 @@ static void hdmi_power_off_full(struct omap_dss_device *dssdev)  }  static int hdmi_display_check_timing(struct omap_dss_device *dssdev, -					struct omap_video_timings *timings) +				     struct videomode *vm)  { -	if (!dispc_mgr_timings_ok(dssdev->dispc_channel, timings)) +	if (!dispc_mgr_timings_ok(dssdev->dispc_channel, vm))  		return -EINVAL;  	return 0;  }  static void hdmi_display_set_timing(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +				    struct videomode *vm)  {  	mutex_lock(&hdmi.lock); -	hdmi.cfg.timings = *timings; +	hdmi.cfg.vm = *vm; -	dispc_set_tv_pclk(timings->pixelclock); +	dispc_set_tv_pclk(vm->pixelclock);  	mutex_unlock(&hdmi.lock);  }  static void hdmi_display_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +				     struct videomode *vm)  { -	*timings = hdmi.cfg.timings; +	*vm = hdmi.cfg.vm;  }  static void hdmi_dump_regs(struct seq_file *s) @@ -378,7 +379,7 @@ static int hdmi_display_enable(struct omap_dss_device *dssdev)  	if (hdmi.audio_configured) {  		r = hdmi5_audio_config(&hdmi.core, &hdmi.wp, &hdmi.audio_config, -				       hdmi.cfg.timings.pixelclock); +				       hdmi.cfg.vm.pixelclock);  		if (r) {  			DSSERR("Error restoring audio configuration: %d", r);  			hdmi.audio_abort_cb(&hdmi.pdev->dev); @@ -669,7 +670,7 @@ static int hdmi_audio_config(struct device *dev,  	}  	ret = hdmi5_audio_config(&hd->core, &hd->wp, dss_audio, -				 hd->cfg.timings.pixelclock); +				 hd->cfg.vm.pixelclock);  	if (!ret) {  		hd->audio_configured = true; diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5_core.c b/drivers/gpu/drm/omapdrm/dss/hdmi5_core.c index 8ab2093daa12..8de1d7b2ae55 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi5_core.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5_core.c @@ -292,35 +292,35 @@ static void hdmi_core_init(struct hdmi_core_vid_config *video_cfg,  {  	DSSDBG("hdmi_core_init\n"); -	video_cfg->v_fc_config.timings = cfg->timings; +	video_cfg->v_fc_config.vm = cfg->vm;  	/* video core */  	video_cfg->data_enable_pol = 1; /* It is always 1*/ -	video_cfg->hblank = cfg->timings.hfp + -				cfg->timings.hbp + cfg->timings.hsw; +	video_cfg->hblank = cfg->vm.hfront_porch + +			    cfg->vm.hback_porch + cfg->vm.hsync_len;  	video_cfg->vblank_osc = 0; -	video_cfg->vblank = cfg->timings.vsw + -				cfg->timings.vfp + cfg->timings.vbp; +	video_cfg->vblank = cfg->vm.vsync_len + cfg->vm.vfront_porch + +			    cfg->vm.vback_porch;  	video_cfg->v_fc_config.hdmi_dvi_mode = cfg->hdmi_dvi_mode; -	if (cfg->timings.interlace) { +	if (cfg->vm.flags & DISPLAY_FLAGS_INTERLACED) {  		/* set vblank_osc if vblank is fractional */  		if (video_cfg->vblank % 2 != 0)  			video_cfg->vblank_osc = 1; -		video_cfg->v_fc_config.timings.y_res /= 2; +		video_cfg->v_fc_config.vm.vactive /= 2;  		video_cfg->vblank /= 2; -		video_cfg->v_fc_config.timings.vfp /= 2; -		video_cfg->v_fc_config.timings.vsw /= 2; -		video_cfg->v_fc_config.timings.vbp /= 2; +		video_cfg->v_fc_config.vm.vfront_porch /= 2; +		video_cfg->v_fc_config.vm.vsync_len /= 2; +		video_cfg->v_fc_config.vm.vback_porch /= 2;  	} -	if (cfg->timings.double_pixel) { -		video_cfg->v_fc_config.timings.x_res *= 2; +	if (cfg->vm.flags & DISPLAY_FLAGS_DOUBLECLK) { +		video_cfg->v_fc_config.vm.hactive *= 2;  		video_cfg->hblank *= 2; -		video_cfg->v_fc_config.timings.hfp *= 2; -		video_cfg->v_fc_config.timings.hsw *= 2; -		video_cfg->v_fc_config.timings.hbp *= 2; +		video_cfg->v_fc_config.vm.hfront_porch *= 2; +		video_cfg->v_fc_config.vm.hsync_len *= 2; +		video_cfg->v_fc_config.vm.hback_porch *= 2;  	}  } @@ -329,13 +329,12 @@ static void hdmi_core_video_config(struct hdmi_core_data *core,  			struct hdmi_core_vid_config *cfg)  {  	void __iomem *base = core->base; +	struct videomode *vm = &cfg->v_fc_config.vm;  	unsigned char r = 0;  	bool vsync_pol, hsync_pol; -	vsync_pol = -		cfg->v_fc_config.timings.vsync_level == OMAPDSS_SIG_ACTIVE_HIGH; -	hsync_pol = -		cfg->v_fc_config.timings.hsync_level == OMAPDSS_SIG_ACTIVE_HIGH; +	vsync_pol = !!(vm->flags & DISPLAY_FLAGS_VSYNC_HIGH); +	hsync_pol = !!(vm->flags & DISPLAY_FLAGS_HSYNC_HIGH);  	/* Set hsync, vsync and data-enable polarity  */  	r = hdmi_read_reg(base, HDMI_CORE_FC_INVIDCONF); @@ -343,20 +342,16 @@ static void hdmi_core_video_config(struct hdmi_core_data *core,  	r = FLD_MOD(r, hsync_pol, 5, 5);  	r = FLD_MOD(r, cfg->data_enable_pol, 4, 4);  	r = FLD_MOD(r, cfg->vblank_osc, 1, 1); -	r = FLD_MOD(r, cfg->v_fc_config.timings.interlace, 0, 0); +	r = FLD_MOD(r, !!(vm->flags & DISPLAY_FLAGS_INTERLACED), 0, 0);  	hdmi_write_reg(base, HDMI_CORE_FC_INVIDCONF, r);  	/* set x resolution */ -	REG_FLD_MOD(base, HDMI_CORE_FC_INHACTIV1, -			cfg->v_fc_config.timings.x_res >> 8, 4, 0); -	REG_FLD_MOD(base, HDMI_CORE_FC_INHACTIV0, -			cfg->v_fc_config.timings.x_res & 0xFF, 7, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_INHACTIV1, vm->hactive >> 8, 4, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_INHACTIV0, vm->hactive & 0xFF, 7, 0);  	/* set y resolution */ -	REG_FLD_MOD(base, HDMI_CORE_FC_INVACTIV1, -			cfg->v_fc_config.timings.y_res >> 8, 4, 0); -	REG_FLD_MOD(base, HDMI_CORE_FC_INVACTIV0, -			cfg->v_fc_config.timings.y_res & 0xFF, 7, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_INVACTIV1, vm->vactive >> 8, 4, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_INVACTIV0, vm->vactive & 0xFF, 7, 0);  	/* set horizontal blanking pixels */  	REG_FLD_MOD(base, HDMI_CORE_FC_INHBLANK1, cfg->hblank >> 8, 4, 0); @@ -366,30 +361,28 @@ static void hdmi_core_video_config(struct hdmi_core_data *core,  	REG_FLD_MOD(base, HDMI_CORE_FC_INVBLANK, cfg->vblank, 7, 0);  	/* set horizontal sync offset */ -	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINDELAY1, -			cfg->v_fc_config.timings.hfp >> 8, 4, 0); -	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINDELAY0, -			cfg->v_fc_config.timings.hfp & 0xFF, 7, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINDELAY1, vm->hfront_porch >> 8, +		    4, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINDELAY0, vm->hfront_porch & 0xFF, +		    7, 0);  	/* set vertical sync offset */ -	REG_FLD_MOD(base, HDMI_CORE_FC_VSYNCINDELAY, -			cfg->v_fc_config.timings.vfp, 7, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_VSYNCINDELAY, vm->vfront_porch, 7, 0);  	/* set horizontal sync pulse width */ -	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINWIDTH1, -			(cfg->v_fc_config.timings.hsw >> 8), 1, 0); -	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINWIDTH0, -			cfg->v_fc_config.timings.hsw & 0xFF, 7, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINWIDTH1, (vm->hsync_len >> 8), +		    1, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_HSYNCINWIDTH0, vm->hsync_len & 0xFF, +		    7, 0);  	/*  set vertical sync pulse width */ -	REG_FLD_MOD(base, HDMI_CORE_FC_VSYNCINWIDTH, -			cfg->v_fc_config.timings.vsw, 5, 0); +	REG_FLD_MOD(base, HDMI_CORE_FC_VSYNCINWIDTH, vm->vsync_len, 5, 0);  	/* select DVI mode */  	REG_FLD_MOD(base, HDMI_CORE_FC_INVIDCONF, -			cfg->v_fc_config.hdmi_dvi_mode, 3, 3); +		    cfg->v_fc_config.hdmi_dvi_mode, 3, 3); -	if (cfg->v_fc_config.timings.double_pixel) +	if (vm->flags & DISPLAY_FLAGS_DOUBLECLK)  		REG_FLD_MOD(base, HDMI_CORE_FC_PRCONF, 2, 7, 4);  	else  		REG_FLD_MOD(base, HDMI_CORE_FC_PRCONF, 1, 7, 4); @@ -616,7 +609,7 @@ int hdmi5_core_handle_irqs(struct hdmi_core_data *core)  void hdmi5_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,  		struct hdmi_config *cfg)  { -	struct omap_video_timings video_timing; +	struct videomode vm;  	struct hdmi_video_format video_format;  	struct hdmi_core_vid_config v_core_cfg; @@ -624,16 +617,16 @@ void hdmi5_configure(struct hdmi_core_data *core, struct hdmi_wp_data *wp,  	hdmi_core_init(&v_core_cfg, cfg); -	hdmi_wp_init_vid_fmt_timings(&video_format, &video_timing, cfg); +	hdmi_wp_init_vid_fmt_timings(&video_format, &vm, cfg); -	hdmi_wp_video_config_timing(wp, &video_timing); +	hdmi_wp_video_config_timing(wp, &vm);  	/* video config */  	video_format.packing_mode = HDMI_PACK_24b_RGB_YUV444_YUV422;  	hdmi_wp_video_config_format(wp, &video_format); -	hdmi_wp_video_config_interface(wp, &video_timing); +	hdmi_wp_video_config_interface(wp, &vm);  	/* support limited range with 24 bit color depth for now */  	hdmi_core_configure_range(core); diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi_wp.c b/drivers/gpu/drm/omapdrm/dss/hdmi_wp.c index 203694a52d18..b783d5a0750e 100644 --- a/drivers/gpu/drm/omapdrm/dss/hdmi_wp.c +++ b/drivers/gpu/drm/omapdrm/dss/hdmi_wp.c @@ -144,87 +144,84 @@ void hdmi_wp_video_config_format(struct hdmi_wp_data *wp,  }  void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp, -		struct omap_video_timings *timings) +				    struct videomode *vm)  {  	u32 r;  	bool vsync_pol, hsync_pol;  	DSSDBG("Enter hdmi_wp_video_config_interface\n"); -	vsync_pol = timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH; -	hsync_pol = timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH; +	vsync_pol = !!(vm->flags & DISPLAY_FLAGS_VSYNC_HIGH); +	hsync_pol = !!(vm->flags & DISPLAY_FLAGS_HSYNC_HIGH);  	r = hdmi_read_reg(wp->base, HDMI_WP_VIDEO_CFG);  	r = FLD_MOD(r, vsync_pol, 7, 7);  	r = FLD_MOD(r, hsync_pol, 6, 6); -	r = FLD_MOD(r, timings->interlace, 3, 3); +	r = FLD_MOD(r, !!(vm->flags & DISPLAY_FLAGS_INTERLACED), 3, 3);  	r = FLD_MOD(r, 1, 1, 0); /* HDMI_TIMING_MASTER_24BIT */  	hdmi_write_reg(wp->base, HDMI_WP_VIDEO_CFG, r);  }  void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, -		struct omap_video_timings *timings) +				 struct videomode *vm)  {  	u32 timing_h = 0;  	u32 timing_v = 0; -	unsigned hsw_offset = 1; +	unsigned hsync_len_offset = 1;  	DSSDBG("Enter hdmi_wp_video_config_timing\n");  	/*  	 * On OMAP4 and OMAP5 ES1 the HSW field is programmed as is. On OMAP5 -	 * ES2+ (including DRA7/AM5 SoCs) HSW field is programmed to hsw-1. +	 * ES2+ (including DRA7/AM5 SoCs) HSW field is programmed to hsync_len-1.  	 * However, we don't support OMAP5 ES1 at all, so we can just check for  	 * OMAP4 here.  	 */  	if (omapdss_get_version() == OMAPDSS_VER_OMAP4430_ES1 ||  	    omapdss_get_version() == OMAPDSS_VER_OMAP4430_ES2 ||  	    omapdss_get_version() == OMAPDSS_VER_OMAP4) -		hsw_offset = 0; +		hsync_len_offset = 0; -	timing_h |= FLD_VAL(timings->hbp, 31, 20); -	timing_h |= FLD_VAL(timings->hfp, 19, 8); -	timing_h |= FLD_VAL(timings->hsw - hsw_offset, 7, 0); +	timing_h |= FLD_VAL(vm->hback_porch, 31, 20); +	timing_h |= FLD_VAL(vm->hfront_porch, 19, 8); +	timing_h |= FLD_VAL(vm->hsync_len - hsync_len_offset, 7, 0);  	hdmi_write_reg(wp->base, HDMI_WP_VIDEO_TIMING_H, timing_h); -	timing_v |= FLD_VAL(timings->vbp, 31, 20); -	timing_v |= FLD_VAL(timings->vfp, 19, 8); -	timing_v |= FLD_VAL(timings->vsw, 7, 0); +	timing_v |= FLD_VAL(vm->vback_porch, 31, 20); +	timing_v |= FLD_VAL(vm->vfront_porch, 19, 8); +	timing_v |= FLD_VAL(vm->vsync_len, 7, 0);  	hdmi_write_reg(wp->base, HDMI_WP_VIDEO_TIMING_V, timing_v);  }  void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt, -		struct omap_video_timings *timings, struct hdmi_config *param) +		struct videomode *vm, struct hdmi_config *param)  {  	DSSDBG("Enter hdmi_wp_video_init_format\n");  	video_fmt->packing_mode = HDMI_PACK_10b_RGB_YUV444; -	video_fmt->y_res = param->timings.y_res; -	video_fmt->x_res = param->timings.x_res; - -	timings->hbp = param->timings.hbp; -	timings->hfp = param->timings.hfp; -	timings->hsw = param->timings.hsw; -	timings->vbp = param->timings.vbp; -	timings->vfp = param->timings.vfp; -	timings->vsw = param->timings.vsw; - -	timings->vsync_level = param->timings.vsync_level; -	timings->hsync_level = param->timings.hsync_level; -	timings->interlace = param->timings.interlace; -	timings->double_pixel = param->timings.double_pixel; - -	if (param->timings.interlace) { +	video_fmt->y_res = param->vm.vactive; +	video_fmt->x_res = param->vm.hactive; + +	vm->hback_porch = param->vm.hback_porch; +	vm->hfront_porch = param->vm.hfront_porch; +	vm->hsync_len = param->vm.hsync_len; +	vm->vback_porch = param->vm.vback_porch; +	vm->vfront_porch = param->vm.vfront_porch; +	vm->vsync_len = param->vm.vsync_len; + +	vm->flags = param->vm.flags; + +	if (param->vm.flags & DISPLAY_FLAGS_INTERLACED) {  		video_fmt->y_res /= 2; -		timings->vbp /= 2; -		timings->vfp /= 2; -		timings->vsw /= 2; +		vm->vback_porch /= 2; +		vm->vfront_porch /= 2; +		vm->vsync_len /= 2;  	} -	if (param->timings.double_pixel) { +	if (param->vm.flags & DISPLAY_FLAGS_DOUBLECLK) {  		video_fmt->x_res *= 2; -		timings->hfp *= 2; -		timings->hsw *= 2; -		timings->hbp *= 2; +		vm->hfront_porch *= 2; +		vm->hsync_len *= 2; +		vm->hback_porch *= 2;  	}  } diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 6eaf1adbd606..b420dde8c0fb 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -290,7 +290,7 @@ struct omap_dss_dsi_videomode_timings {  struct omap_dss_dsi_config {  	enum omap_dss_dsi_mode mode;  	enum omap_dss_dsi_pixel_format pixel_format; -	const struct omap_video_timings *timings; +	const struct videomode *vm;  	unsigned long hs_clk_min, hs_clk_max;  	unsigned long lp_clk_min, lp_clk_max; @@ -299,48 +299,12 @@ struct omap_dss_dsi_config {  	enum omap_dss_dsi_trans_mode trans_mode;  }; -struct omap_video_timings { -	/* Unit: pixels */ -	u16 x_res; -	/* Unit: pixels */ -	u16 y_res; -	/* Unit: Hz */ -	u32 pixelclock; -	/* Unit: pixel clocks */ -	u16 hsw;	/* Horizontal synchronization pulse width */ -	/* Unit: pixel clocks */ -	u16 hfp;	/* Horizontal front porch */ -	/* Unit: pixel clocks */ -	u16 hbp;	/* Horizontal back porch */ -	/* Unit: line clocks */ -	u16 vsw;	/* Vertical synchronization pulse width */ -	/* Unit: line clocks */ -	u16 vfp;	/* Vertical front porch */ -	/* Unit: line clocks */ -	u16 vbp;	/* Vertical back porch */ - -	/* Vsync logic level */ -	enum omap_dss_signal_level vsync_level; -	/* Hsync logic level */ -	enum omap_dss_signal_level hsync_level; -	/* Interlaced or Progressive timings */ -	bool interlace; -	/* Pixel clock edge to drive LCD data */ -	enum omap_dss_signal_edge data_pclk_edge; -	/* Data enable logic level */ -	enum omap_dss_signal_level de_level; -	/* Pixel clock edges to drive HSYNC and VSYNC signals */ -	enum omap_dss_signal_edge sync_pclk_edge; - -	bool double_pixel; -}; - -/* Hardcoded timings for tv modes. Venc only uses these to +/* Hardcoded videomodes for tv. Venc only uses these to   * identify the mode, and does not actually use the configs   * itself. However, the configs should be something that   * a normal monitor can also show */ -extern const struct omap_video_timings omap_dss_pal_timings; -extern const struct omap_video_timings omap_dss_ntsc_timings; +extern const struct videomode omap_dss_pal_vm; +extern const struct videomode omap_dss_ntsc_vm;  struct omap_dss_cpr_coefs {  	s16 rr, rg, rb; @@ -502,11 +466,11 @@ struct omapdss_dpi_ops {  	void (*disable)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines);  }; @@ -521,11 +485,11 @@ struct omapdss_sdi_ops {  	void (*disable)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*set_datapairs)(struct omap_dss_device *dssdev, int datapairs);  }; @@ -540,11 +504,11 @@ struct omapdss_dvi_ops {  	void (*disable)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  };  struct omapdss_atv_ops { @@ -557,11 +521,11 @@ struct omapdss_atv_ops {  	void (*disable)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*set_type)(struct omap_dss_device *dssdev,  		enum omap_dss_venc_type type); @@ -582,11 +546,11 @@ struct omapdss_hdmi_ops {  	void (*disable)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);  	bool (*detect)(struct omap_dss_device *dssdev); @@ -692,7 +656,7 @@ struct omap_dss_device {  	} phy;  	struct { -		struct omap_video_timings timings; +		struct videomode vm;  		enum omap_dss_dsi_pixel_format dsi_pix_fmt;  		enum omap_dss_dsi_mode dsi_mode; @@ -785,11 +749,11 @@ struct omap_dss_driver {  	int (*get_recommended_bpp)(struct omap_dss_device *dssdev);  	int (*check_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			     struct videomode *vm);  	void (*set_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	void (*get_timings)(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings); +			    struct videomode *vm);  	int (*set_wss)(struct omap_dss_device *dssdev, u32 wss);  	u32 (*get_wss)(struct omap_dss_device *dssdev); @@ -819,11 +783,6 @@ struct omap_dss_device *omap_dss_find_device(void *data,  		int (*match)(struct omap_dss_device *dssdev, void *data));  const char *omapdss_get_default_display_name(void); -void videomode_to_omap_video_timings(const struct videomode *vm, -		struct omap_video_timings *ovt); -void omap_video_timings_to_videomode(const struct omap_video_timings *ovt, -		struct videomode *vm); -  int dss_feat_get_num_mgrs(void);  int dss_feat_get_num_ovls(void);  enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); @@ -852,7 +811,7 @@ void omapdss_default_get_resolution(struct omap_dss_device *dssdev,  		u16 *xres, u16 *yres);  int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);  void omapdss_default_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings); +				 struct videomode *vm);  typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);  int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); @@ -906,7 +865,7 @@ void dispc_mgr_go(enum omap_channel channel);  void dispc_mgr_set_lcd_config(enum omap_channel channel,  		const struct dss_lcd_mgr_config *config);  void dispc_mgr_set_timings(enum omap_channel channel, -		const struct omap_video_timings *timings); +		const struct videomode *vm);  void dispc_mgr_setup(enum omap_channel channel,  		const struct omap_overlay_manager_info *info);  u32 dispc_mgr_gamma_size(enum omap_channel channel); @@ -919,8 +878,7 @@ bool dispc_ovl_enabled(enum omap_plane plane);  void dispc_ovl_set_channel_out(enum omap_plane plane,  		enum omap_channel channel);  int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi, -		bool replication, const struct omap_video_timings *mgr_timings, -		bool mem_to_mem); +		bool replication, const struct videomode *vm, bool mem_to_mem);  enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel); @@ -934,7 +892,7 @@ struct dss_mgr_ops {  	int (*enable)(enum omap_channel channel);  	void (*disable)(enum omap_channel channel);  	void (*set_timings)(enum omap_channel channel, -			const struct omap_video_timings *timings); +			const struct videomode *vm);  	void (*set_lcd_config)(enum omap_channel channel,  			const struct dss_lcd_mgr_config *config);  	int (*register_framedone_handler)(enum omap_channel channel, @@ -951,7 +909,7 @@ int dss_mgr_connect(enum omap_channel channel,  void dss_mgr_disconnect(enum omap_channel channel,  		struct omap_dss_device *dst);  void dss_mgr_set_timings(enum omap_channel channel, -		const struct omap_video_timings *timings); +		const struct videomode *vm);  void dss_mgr_set_lcd_config(enum omap_channel channel,  		const struct dss_lcd_mgr_config *config);  int dss_mgr_enable(enum omap_channel channel); diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c index 24f859488201..a901af5a9bc3 100644 --- a/drivers/gpu/drm/omapdrm/dss/output.c +++ b/drivers/gpu/drm/omapdrm/dss/output.c @@ -201,10 +201,9 @@ void dss_mgr_disconnect(enum omap_channel channel,  }  EXPORT_SYMBOL(dss_mgr_disconnect); -void dss_mgr_set_timings(enum omap_channel channel, -		const struct omap_video_timings *timings) +void dss_mgr_set_timings(enum omap_channel channel, const struct videomode *vm)  { -	dss_mgr_ops->set_timings(channel, timings); +	dss_mgr_ops->set_timings(channel, vm);  }  EXPORT_SYMBOL(dss_mgr_set_timings); diff --git a/drivers/gpu/drm/omapdrm/dss/rfbi.c b/drivers/gpu/drm/omapdrm/dss/rfbi.c index cd53566d75eb..09724757366a 100644 --- a/drivers/gpu/drm/omapdrm/dss/rfbi.c +++ b/drivers/gpu/drm/omapdrm/dss/rfbi.c @@ -113,7 +113,7 @@ static struct {  	struct semaphore bus_lock; -	struct omap_video_timings timings; +	struct videomode vm;  	int pixel_size;  	int data_lines;  	struct rfbi_timings intf_timings; @@ -308,15 +308,15 @@ static int rfbi_transfer_area(struct omap_dss_device *dssdev,  	u32 l;  	int r;  	struct omap_overlay_manager *mgr = rfbi.output.manager; -	u16 width = rfbi.timings.x_res; -	u16 height = rfbi.timings.y_res; +	u16 width = rfbi.vm.hactive; +	u16 height = rfbi.vm.vactive;  	/*BUG_ON(callback == 0);*/  	BUG_ON(rfbi.framedone_callback != NULL);  	DSSDBG("rfbi_transfer_area %dx%d\n", width, height); -	dss_mgr_set_timings(mgr, &rfbi.timings); +	dss_mgr_set_timings(mgr, &rfbi.vm);  	r = dss_mgr_enable(mgr);  	if (r) @@ -777,8 +777,8 @@ static int rfbi_update(struct omap_dss_device *dssdev, void (*callback)(void *),  static void rfbi_set_size(struct omap_dss_device *dssdev, u16 w, u16 h)  { -	rfbi.timings.x_res = w; -	rfbi.timings.y_res = h; +	rfbi.vm.hactive = w; +	rfbi.vm.vactive = h;  }  static void rfbi_set_pixel_size(struct omap_dss_device *dssdev, int pixel_size) @@ -854,25 +854,30 @@ static void rfbi_config_lcd_manager(struct omap_dss_device *dssdev)  	dss_mgr_set_lcd_config(mgr, &mgr_config);  	/* -	 * Set rfbi.timings with default values, the x_res and y_res fields +	 * Set rfbi.timings with default values, the hactive and vactive fields  	 * are expected to be already configured by the panel driver via  	 * omapdss_rfbi_set_size()  	 */ -	rfbi.timings.hsw = 1; -	rfbi.timings.hfp = 1; -	rfbi.timings.hbp = 1; -	rfbi.timings.vsw = 1; -	rfbi.timings.vfp = 0; -	rfbi.timings.vbp = 0; - -	rfbi.timings.interlace = false; -	rfbi.timings.hsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	rfbi.timings.vsync_level = OMAPDSS_SIG_ACTIVE_HIGH; -	rfbi.timings.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; -	rfbi.timings.de_level = OMAPDSS_SIG_ACTIVE_HIGH; -	rfbi.timings.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE; - -	dss_mgr_set_timings(mgr, &rfbi.timings); +	rfbi.vm.hsync_len = 1; +	rfbi.vm.hfront_porch = 1; +	rfbi.vm.hback_porch = 1; +	rfbi.vm.vsync_len = 1; +	rfbi.vm.vfront_porch = 0; +	rfbi.vm.vback_porch = 0; + +	rfbi.vm.flags &= ~DISPLAY_FLAGS_INTERLACED; +	rfbi.vm.flags &= ~DISPLAY_FLAGS_HSYNC_LOW; +	rfbi.vm.flags |= DISPLAY_FLAGS_HSYNC_HIGH; +	rfbi.vm.flags &= ~DISPLAY_FLAGS_VSYNC_LOW; +	rfbi.vm.flags |= DISPLAY_FLAGS_VSYNC_HIGH; +	rfbi.vm.flags &= ~DISPLAY_FLAGS_PIXDATA_NEGEDGE; +	rfbi.vm.flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; +	rfbi.vm.flags &= ~DISPLAY_FLAGS_DE_LOW; +	rfbi.vm.flags |= DISPLAY_FLAGS_DE_HIGH; +	rfbi.vm.flags &= ~DISPLAY_FLAGS_SYNC_POSEDGE; +	rfbi.vm.flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; + +	dss_mgr_set_timings(mgr, &rfbi.vm);  }  static int rfbi_display_enable(struct omap_dss_device *dssdev) diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c index 0a96c321ce62..b3bda2d3c08d 100644 --- a/drivers/gpu/drm/omapdrm/dss/sdi.c +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c @@ -39,7 +39,7 @@ static struct {  	struct regulator *vdds_sdi_reg;  	struct dss_lcd_mgr_config mgr_config; -	struct omap_video_timings timings; +	struct videomode vm;  	int datapairs;  	struct omap_dss_device output; @@ -131,7 +131,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)  {  	struct omap_dss_device *out = &sdi.output;  	enum omap_channel channel = dssdev->dispc_channel; -	struct omap_video_timings *t = &sdi.timings; +	struct videomode *vm = &sdi.vm;  	unsigned long fck;  	struct dispc_clock_info dispc_cinfo;  	unsigned long pck; @@ -151,10 +151,9 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)  		goto err_get_dispc;  	/* 15.5.9.1.2 */ -	t->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; -	t->sync_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; +	vm->flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE | DISPLAY_FLAGS_SYNC_POSEDGE; -	r = sdi_calc_clock_div(t->pixelclock, &fck, &dispc_cinfo); +	r = sdi_calc_clock_div(vm->pixelclock, &fck, &dispc_cinfo);  	if (r)  		goto err_calc_clock_div; @@ -162,15 +161,15 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)  	pck = fck / dispc_cinfo.lck_div / dispc_cinfo.pck_div; -	if (pck != t->pixelclock) { -		DSSWARN("Could not find exact pixel clock. Requested %d Hz, got %lu Hz\n", -			t->pixelclock, pck); +	if (pck != vm->pixelclock) { +		DSSWARN("Could not find exact pixel clock. Requested %lu Hz, got %lu Hz\n", +			vm->pixelclock, pck); -		t->pixelclock = pck; +		vm->pixelclock = pck;  	} -	dss_mgr_set_timings(channel, t); +	dss_mgr_set_timings(channel, vm);  	r = dss_set_fck_rate(fck);  	if (r) @@ -229,26 +228,26 @@ static void sdi_display_disable(struct omap_dss_device *dssdev)  }  static void sdi_set_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			    struct videomode *vm)  { -	sdi.timings = *timings; +	sdi.vm = *vm;  }  static void sdi_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			    struct videomode *vm)  { -	*timings = sdi.timings; +	*vm = sdi.vm;  }  static int sdi_check_timings(struct omap_dss_device *dssdev, -			struct omap_video_timings *timings) +			     struct videomode *vm)  {  	enum omap_channel channel = dssdev->dispc_channel; -	if (!dispc_mgr_timings_ok(channel, timings)) +	if (!dispc_mgr_timings_ok(channel, vm))  		return -EINVAL; -	if (timings->pixelclock == 0) +	if (vm->pixelclock == 0)  		return -EINVAL;  	return 0; diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c index 6eedf2118708..d74f7fcc2e46 100644 --- a/drivers/gpu/drm/omapdrm/dss/venc.c +++ b/drivers/gpu/drm/omapdrm/dss/venc.c @@ -262,47 +262,41 @@ static const struct venc_config venc_config_pal_bdghi = {  	.fid_ext_start_y__fid_ext_offset_y	= 0x01380005,  }; -const struct omap_video_timings omap_dss_pal_timings = { -	.x_res		= 720, -	.y_res		= 574, +const struct videomode omap_dss_pal_vm = { +	.hactive	= 720, +	.vactive	= 574,  	.pixelclock	= 13500000, -	.hsw		= 64, -	.hfp		= 12, -	.hbp		= 68, -	.vsw		= 5, -	.vfp		= 5, -	.vbp		= 41, - -	.interlace	= true, - -	.hsync_level = OMAPDSS_SIG_ACTIVE_LOW, -	.vsync_level = OMAPDSS_SIG_ACTIVE_LOW, -	.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE, -	.de_level = OMAPDSS_SIG_ACTIVE_HIGH, -	.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE, +	.hsync_len	= 64, +	.hfront_porch	= 12, +	.hback_porch	= 68, +	.vsync_len	= 5, +	.vfront_porch	= 5, +	.vback_porch	= 41, + +	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW | +			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH | +			  DISPLAY_FLAGS_PIXDATA_POSEDGE | +			  DISPLAY_FLAGS_SYNC_NEGEDGE,  }; -EXPORT_SYMBOL(omap_dss_pal_timings); +EXPORT_SYMBOL(omap_dss_pal_vm); -const struct omap_video_timings omap_dss_ntsc_timings = { -	.x_res		= 720, -	.y_res		= 482, +const struct videomode omap_dss_ntsc_vm = { +	.hactive	= 720, +	.vactive	= 482,  	.pixelclock	= 13500000, -	.hsw		= 64, -	.hfp		= 16, -	.hbp		= 58, -	.vsw		= 6, -	.vfp		= 6, -	.vbp		= 31, - -	.interlace	= true, - -	.hsync_level = OMAPDSS_SIG_ACTIVE_LOW, -	.vsync_level = OMAPDSS_SIG_ACTIVE_LOW, -	.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE, -	.de_level = OMAPDSS_SIG_ACTIVE_HIGH, -	.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE, +	.hsync_len	= 64, +	.hfront_porch	= 16, +	.hback_porch	= 58, +	.vsync_len	= 6, +	.vfront_porch	= 6, +	.vback_porch	= 31, + +	.flags		= DISPLAY_FLAGS_INTERLACED | DISPLAY_FLAGS_HSYNC_LOW | +			  DISPLAY_FLAGS_VSYNC_LOW | DISPLAY_FLAGS_DE_HIGH | +			  DISPLAY_FLAGS_PIXDATA_POSEDGE | +			  DISPLAY_FLAGS_SYNC_NEGEDGE,  }; -EXPORT_SYMBOL(omap_dss_ntsc_timings); +EXPORT_SYMBOL(omap_dss_ntsc_vm);  static struct {  	struct platform_device *pdev; @@ -313,7 +307,7 @@ static struct {  	struct clk	*tv_dac_clk; -	struct omap_video_timings timings; +	struct videomode vm;  	enum omap_dss_venc_type type;  	bool invert_polarity; @@ -427,13 +421,12 @@ static void venc_runtime_put(void)  	WARN_ON(r < 0 && r != -ENOSYS);  } -static const struct venc_config *venc_timings_to_config( -		struct omap_video_timings *timings) +static const struct venc_config *venc_timings_to_config(struct videomode *vm)  { -	if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) +	if (memcmp(&omap_dss_pal_vm, vm, sizeof(*vm)) == 0)  		return &venc_config_pal_trm; -	if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) +	if (memcmp(&omap_dss_ntsc_vm, vm, sizeof(*vm)) == 0)  		return &venc_config_ntsc_trm;  	BUG(); @@ -451,7 +444,7 @@ static int venc_power_on(struct omap_dss_device *dssdev)  		goto err0;  	venc_reset(); -	venc_write_config(venc_timings_to_config(&venc.timings)); +	venc_write_config(venc_timings_to_config(&venc.vm));  	dss_set_venc_output(venc.type);  	dss_set_dac_pwrdn_bgz(1); @@ -468,7 +461,7 @@ static int venc_power_on(struct omap_dss_device *dssdev)  	venc_write_reg(VENC_OUTPUT_CONTROL, l); -	dss_mgr_set_timings(channel, &venc.timings); +	dss_mgr_set_timings(channel, &venc.vm);  	r = regulator_enable(venc.vdda_dac_reg);  	if (r) @@ -546,17 +539,17 @@ static void venc_display_disable(struct omap_dss_device *dssdev)  }  static void venc_set_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			     struct videomode *vm)  {  	DSSDBG("venc_set_timings\n");  	mutex_lock(&venc.venc_lock);  	/* Reset WSS data when the TV standard changes. */ -	if (memcmp(&venc.timings, timings, sizeof(*timings))) +	if (memcmp(&venc.vm, vm, sizeof(*vm)))  		venc.wss_data = 0; -	venc.timings = *timings; +	venc.vm = *vm;  	dispc_set_tv_pclk(13500000); @@ -564,25 +557,25 @@ static void venc_set_timings(struct omap_dss_device *dssdev,  }  static int venc_check_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			      struct videomode *vm)  {  	DSSDBG("venc_check_timings\n"); -	if (memcmp(&omap_dss_pal_timings, timings, sizeof(*timings)) == 0) +	if (memcmp(&omap_dss_pal_vm, vm, sizeof(*vm)) == 0)  		return 0; -	if (memcmp(&omap_dss_ntsc_timings, timings, sizeof(*timings)) == 0) +	if (memcmp(&omap_dss_ntsc_vm, vm, sizeof(*vm)) == 0)  		return 0;  	return -EINVAL;  }  static void venc_get_timings(struct omap_dss_device *dssdev, -		struct omap_video_timings *timings) +			     struct videomode *vm)  {  	mutex_lock(&venc.venc_lock); -	*timings = venc.timings; +	*vm = venc.vm;  	mutex_unlock(&venc.venc_lock);  } @@ -602,7 +595,7 @@ static int venc_set_wss(struct omap_dss_device *dssdev, u32 wss)  	mutex_lock(&venc.venc_lock); -	config = venc_timings_to_config(&venc.timings); +	config = venc_timings_to_config(&venc.vm);  	/* Invert due to VENC_L21_WC_CTL:INV=1 */  	venc.wss_data = (wss ^ 0xfffff) << 8; |