Re: [2/2] drm/bridge: tc358767: Reset chip again on attach

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Am Montag, 13. Mai 2024, 04:16:28 CEST schrieb Marek Vasut:
> In case the chip is released from reset using the RESX signal while the
> DSI lanes are in non-LP11 mode, the chip may enter some sort of debug
> mode, where its internal clock run at 1/6th of expected clock rate. In
> this mode, the AUX channel also operates at 1/6th of the 10 MHz mandated
> by DP specification, which breaks DPCD communication.
> 
> There is no known software way of bringing the chip out of this state
> once the chip enters it, except for toggling the RESX signal and
> performing full reset.
> 
> The chip may enter this mode when the chip was released from reset in
> probe(), because at that point the DSI lane mode is undefined.
> 
> When the .attach callback is called, the DSI link is surely in LP11 mode.
> Toggle the RESX signal here and reconfigure the AUX channel. That way,
> the AUX channel communication from this point on does surely run at
> 10 MHz as it should.
> 
> Signed-off-by: Marek Vasut <marex@xxxxxxx>

This does the trick on my hardware as well.
Reviewed-by: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx>
> ---
> Cc: Adam Ford <aford173@xxxxxxxxx>
> Cc: Alexander Stein <alexander.stein@xxxxxxxxxxxxxxx>
> Cc: Andrzej Hajda <andrzej.hajda@xxxxxxxxx>
> Cc: Daniel Vetter <daniel@xxxxxxxx>
> Cc: David Airlie <airlied@xxxxxxxxx>
> Cc: Frieder Schrempf <frieder.schrempf@xxxxxxxxxx>
> Cc: Inki Dae <inki.dae@xxxxxxxxxxx>
> Cc: Jagan Teki <jagan@xxxxxxxxxxxxxxxxxxxx>
> Cc: Jernej Skrabec <jernej.skrabec@xxxxxxxxx>
> Cc: Jonas Karlman <jonas@xxxxxxxxx>
> Cc: Laurent Pinchart <Laurent.pinchart@xxxxxxxxxxxxxxxx>
> Cc: Lucas Stach <l.stach@xxxxxxxxxxxxxx>
> Cc: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx>
> Cc: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>
> Cc: Maxime Ripard <mripard@xxxxxxxxxx>
> Cc: Michael Walle <mwalle@xxxxxxxxxx>
> Cc: Neil Armstrong <neil.armstrong@xxxxxxxxxx>
> Cc: Robert Foss <rfoss@xxxxxxxxxx>
> Cc: Thomas Zimmermann <tzimmermann@xxxxxxx>
> Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx
> Cc: kernel@xxxxxxxxxxxxxxxxxx
> ---
>  drivers/gpu/drm/bridge/tc358767.c | 50 +++++++++++++++++++++++++++++++
>  1 file changed, 50 insertions(+)
> 
> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> index fe2b93546eaef..9b01dc885973c 100644
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
> @@ -1749,10 +1749,30 @@ static const struct drm_connector_funcs tc_connector_funcs = {
>  	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>  };
>  
> +static void tc_bridge_reset(struct tc_data *tc)
> +{
> +	if (!tc->reset_gpio)
> +		return;
> +
> +	gpiod_set_value_cansleep(tc->reset_gpio, 0);
> +	usleep_range(10000, 11000);
> +	gpiod_set_value_cansleep(tc->reset_gpio, 1);
> +	usleep_range(5000, 10000);
> +}
> +
>  static int tc_dpi_bridge_attach(struct drm_bridge *bridge,
>  				enum drm_bridge_attach_flags flags)
>  {
>  	struct tc_data *tc = bridge_to_tc(bridge);
> +	int ret;
> +
> +	if (tc->reset_gpio) {
> +		tc_bridge_reset(tc);
> +
> +		ret = tc_set_syspllparam(tc);
> +		if (ret)
> +			return ret;
> +	}
>  
>  	if (!tc->panel_bridge)
>  		return 0;
> @@ -1769,6 +1789,36 @@ static int tc_edp_bridge_attach(struct drm_bridge *bridge,
>  	struct drm_device *drm = bridge->dev;
>  	int ret;
>  
> +	if (tc->reset_gpio) {
> +		/*
> +		 * In case the chip is released from reset using the RESX
> +		 * signal while the DSI lanes are in non-LP11 mode, the chip
> +		 * may enter some sort of debug mode, where its internal
> +		 * clock run at 1/6th of expected clock rate. In this mode,
> +		 * the AUX channel also operates at 1/6th of the 10 MHz
> +		 * mandated by DP specification, which breaks DPCD
> +		 * communication.
> +		 *
> +		 * There is no known software way of bringing the chip out of
> +		 * this state once the chip enters it, except for toggling
> +		 * the RESX signal and performing full reset.
> +		 *
> +		 * The chip may enter this mode when the chip was released
> +		 * from reset in probe(), because at that point the DSI lane
> +		 * mode is undefined.
> +		 *
> +		 * At this point, the DSI link is surely in LP11 mode. Toggle
> +		 * the RESX signal here and reconfigure the AUX channel. That
> +		 * way, the AUX channel communication from this point on does
> +		 * surely run at 10 MHz as it should.
> +		 */
> +		tc_bridge_reset(tc);
> +
> +		ret = tc_aux_link_setup(tc);
> +		if (ret)
> +			return ret;
> +	}
> +
>  	if (tc->panel_bridge) {
>  		/* If a connector is required then this driver shall create it */
>  		ret = drm_bridge_attach(tc->bridge.encoder, tc->panel_bridge,
> 


-- 
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/






[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux