diff options
| author | Marek Vasut <marex@denx.de> | 2023-06-15 22:19:02 +0200 | 
|---|---|---|
| committer | Robert Foss <rfoss@kernel.org> | 2023-06-22 11:13:31 +0200 | 
| commit | 7f4e171f9d05c2371e477005db8f5f965f4fb25f (patch) | |
| tree | 3e1ead3f4ff639e186f2d32da228a02119359992 /drivers/gpu | |
| parent | 80382226ef6ff7789ad96227a7f2ded95244e96e (diff) | |
drm/bridge: tc358762: Handle HS/VS polarity
Add support for handling the HS/VS sync signals polarity in the bridge
driver, otherwise e.g. DSIM bridge feeds the TC358762 inverted polarity
sync signals and the image is shifted to the left, up, and wobbly.
Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230615201902.566182-5-marex@denx.de
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/bridge/tc358762.c | 27 | 
1 files changed, 25 insertions, 2 deletions
| diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c index a092e2096074..46198af9eebb 100644 --- a/drivers/gpu/drm/bridge/tc358762.c +++ b/drivers/gpu/drm/bridge/tc358762.c @@ -74,6 +74,7 @@ struct tc358762 {  	struct regulator *regulator;  	struct drm_bridge *panel_bridge;  	struct gpio_desc *reset_gpio; +	struct drm_display_mode mode;  	bool pre_enabled;  	int error;  }; @@ -114,6 +115,8 @@ static inline struct tc358762 *bridge_to_tc358762(struct drm_bridge *bridge)  static int tc358762_init(struct tc358762 *ctx)  { +	u32 lcdctrl; +  	tc358762_write(ctx, DSI_LANEENABLE,  		       LANEENABLE_L0EN | LANEENABLE_CLEN);  	tc358762_write(ctx, PPI_D0S_CLRSIPOCOUNT, 5); @@ -123,8 +126,18 @@ static int tc358762_init(struct tc358762 *ctx)  	tc358762_write(ctx, PPI_LPTXTIMECNT, LPX_PERIOD);  	tc358762_write(ctx, SPICMR, 0x00); -	tc358762_write(ctx, LCDCTRL, LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 | -				     LCDCTRL_UNK6 | LCDCTRL_VTGEN); + +	lcdctrl = LCDCTRL_VSDELAY(1) | LCDCTRL_RGB888 | +		  LCDCTRL_UNK6 | LCDCTRL_VTGEN; + +	if (ctx->mode.flags & DRM_MODE_FLAG_NHSYNC) +		lcdctrl |= LCDCTRL_HSPOL; + +	if (ctx->mode.flags & DRM_MODE_FLAG_NVSYNC) +		lcdctrl |= LCDCTRL_VSPOL; + +	tc358762_write(ctx, LCDCTRL, lcdctrl); +  	tc358762_write(ctx, SYSCTRL, 0x040f);  	msleep(100); @@ -194,6 +207,15 @@ static int tc358762_attach(struct drm_bridge *bridge,  				 bridge, flags);  } +static void tc358762_bridge_mode_set(struct drm_bridge *bridge, +				     const struct drm_display_mode *mode, +				     const struct drm_display_mode *adj) +{ +	struct tc358762 *ctx = bridge_to_tc358762(bridge); + +	drm_mode_copy(&ctx->mode, mode); +} +  static const struct drm_bridge_funcs tc358762_bridge_funcs = {  	.atomic_post_disable = tc358762_post_disable,  	.atomic_pre_enable = tc358762_pre_enable, @@ -202,6 +224,7 @@ static const struct drm_bridge_funcs tc358762_bridge_funcs = {  	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,  	.atomic_reset = drm_atomic_helper_bridge_reset,  	.attach = tc358762_attach, +	.mode_set = tc358762_bridge_mode_set,  };  static int tc358762_parse_dt(struct tc358762 *ctx) | 
