All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv4 00/24] drm/bridge: tc358767: DP support
@ 2019-05-28  8:27 ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 01/24] drm/bridge: tc358767: fix tc_aux_get_status error handling Tomi Valkeinen
                     ` (24 more replies)
  0 siblings, 25 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Hi,

tc358767 bridge was originally implemented for eDP use with an embedded
panel. I've been working to add DP and HPD support, and this series is
the result. I did have a lot of issues with link training, but with
these, it's been working reliably with my devices.

Changes in v2
* Drop "implement naive HPD handling", and implement HPD interrupt handling.

Changes in v3
* Various small comment, description and formatting changes
* 'hpd-num' DT property renamed to 'toshiba,hpd-pin'
* Check DP0CTL == 0 at the beginning of tc_main_link_enable
* Disable only the video stream in tc_stream_disable()
* Fix tc_connector_detect for eDP panels

Changes in v4
* Add "read display_props in get_modes()"
* Remove the tc_get_display_props call from detect callback
* Fix the DP0CTL check in tc_main_link_enable. Only check for DP_EN bit,
  as we can have other bits set (e.g. after reset VID_MN_GEN is set)
* Added some reviewed-bys

 Tomi

Tomi Valkeinen (24):
  drm/bridge: tc358767: fix tc_aux_get_status error handling
  drm/bridge: tc358767: reset voltage-swing & pre-emphasis
  drm/bridge: tc358767: fix ansi 8b10b use
  drm/bridge: tc358767: cleanup spread & scrambler_dis
  drm/bridge: tc358767: remove unused swing & preemp
  drm/bridge: tc358767: cleanup aux_link_setup
  drm/bridge: tc358767: move video stream setup to tc_main_link_stream
  drm/bridge: tc358767: split stream enable/disable
  drm/bridge: tc358767: move PXL PLL enable/disable to stream
    enable/disable
  drm/bridge: tc358767: add link disable function
  drm/bridge: tc358767: disable only video stream in tc_stream_disable
  drm/bridge: tc358767: ensure DP is disabled before LT
  drm/bridge: tc358767: remove unnecessary msleep
  drm/bridge: tc358767: use more reliable seq when finishing LT
  drm/bridge: tc358767: cleanup LT result check
  drm/bridge: tc358767: clean-up link training
  drm/bridge: tc358767: remove check for video mode in link enable
  drm/bridge: tc358767: use bridge mode_valid
  drm/bridge: tc358767: remove tc_connector_best_encoder
  drm/bridge: tc358767: copy the mode data, instead of storing the
    pointer
  drm/bridge: tc358767: read display_props in get_modes()
  drm/bridge: tc358767: add GPIO & interrupt registers
  drm/bridge: tc358767: add IRQ and HPD support
  dt-bindings: tc358767: add HPD support

 .../display/bridge/toshiba,tc358767.txt       |   1 +
 drivers/gpu/drm/bridge/tc358767.c             | 593 +++++++++++-------
 2 files changed, 382 insertions(+), 212 deletions(-)

--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCHv4 01/24] drm/bridge: tc358767: fix tc_aux_get_status error handling
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 02/24] drm/bridge: tc358767: reset voltage-swing & pre-emphasis Tomi Valkeinen
                     ` (23 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

tc_aux_get_status() does not report AUX_TIMEOUT correctly, as it only
checks the AUX_TIMEOUT if aux is still busy. Fix this by always checking
for AUX_TIMEOUT.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index e570c9dee180..b6c4d1063ccb 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -286,14 +286,17 @@ static int tc_aux_get_status(struct tc_data *tc, u8 *reply)
 	ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &value);
 	if (ret < 0)
 		return ret;
+
 	if (value & AUX_BUSY) {
-		if (value & AUX_TIMEOUT) {
-			dev_err(tc->dev, "i2c access timeout!\n");
-			return -ETIMEDOUT;
-		}
+		dev_err(tc->dev, "aux busy!\n");
 		return -EBUSY;
 	}
 
+	if (value & AUX_TIMEOUT) {
+		dev_err(tc->dev, "aux access timeout!\n");
+		return -ETIMEDOUT;
+	}
+
 	*reply = (value & AUX_STATUS_MASK) >> AUX_STATUS_SHIFT;
 	return 0;
 }
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 02/24] drm/bridge: tc358767: reset voltage-swing & pre-emphasis
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 01/24] drm/bridge: tc358767: fix tc_aux_get_status error handling Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 03/24] drm/bridge: tc358767: fix ansi 8b10b use Tomi Valkeinen
                     ` (22 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

We need to reset DPCD voltage-swing & pre-emphasis before starting the
link training, as otherwise tc358767 will use the previous values as
minimums.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index b6c4d1063ccb..c8b04f711db3 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -956,6 +956,13 @@ static int tc_main_link_setup(struct tc_data *tc)
 	if (ret < 0)
 		goto err_dpcd_write;
 
+	/* Reset voltage-swing & pre-emphasis */
+	tmp[0] = tmp[1] = DP_TRAIN_VOLTAGE_SWING_LEVEL_0 |
+			  DP_TRAIN_PRE_EMPH_LEVEL_0;
+	ret = drm_dp_dpcd_write(aux, DP_TRAINING_LANE0_SET, tmp, 2);
+	if (ret < 0)
+		goto err_dpcd_write;
+
 	ret = tc_link_training(tc, DP_TRAINING_PATTERN_1);
 	if (ret)
 		goto err;
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 03/24] drm/bridge: tc358767: fix ansi 8b10b use
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 01/24] drm/bridge: tc358767: fix tc_aux_get_status error handling Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 02/24] drm/bridge: tc358767: reset voltage-swing & pre-emphasis Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 04/24] drm/bridge: tc358767: cleanup spread & scrambler_dis Tomi Valkeinen
                     ` (21 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

DP always uses ANSI 8B10B encoding. Some monitors (old?) may not have
the ANSI 8B10B bit set in DPCD, even if it should always be set.

The tc358767 driver currently respects that flag, and turns the encoding
off if the monitor does not have the bit set, which then results in the
monitor not working.

This patch makes the driver to always use ANSI 8B10B encoding, and drops
the 'coding8b10b' field which is no longer used.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index c8b04f711db3..33e27dc2f0b4 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -188,7 +188,6 @@ struct tc_edp_link {
 	u8			assr;
 	int			scrambler_dis;
 	int			spread;
-	int			coding8b10b;
 	u8			swing;
 	u8			preemp;
 };
@@ -390,13 +389,10 @@ static u32 tc_srcctrl(struct tc_data *tc)
 	 * No training pattern, skew lane 1 data by two LSCLK cycles with
 	 * respect to lane 0 data, AutoCorrect Mode = 0
 	 */
-	u32 reg = DP0_SRCCTRL_NOTP | DP0_SRCCTRL_LANESKEW;
+	u32 reg = DP0_SRCCTRL_NOTP | DP0_SRCCTRL_LANESKEW | DP0_SRCCTRL_EN810B;
 
 	if (tc->link.scrambler_dis)
 		reg |= DP0_SRCCTRL_SCRMBLDIS;	/* Scrambler Disabled */
-	if (tc->link.coding8b10b)
-		/* Enable 8/10B Encoder (TxData[19:16] not used) */
-		reg |= DP0_SRCCTRL_EN810B;
 	if (tc->link.spread)
 		reg |= DP0_SRCCTRL_SSCG;	/* Spread Spectrum Enable */
 	if (tc->link.base.num_lanes == 2)
@@ -635,7 +631,7 @@ static int tc_get_display_props(struct tc_data *tc)
 	ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, tmp);
 	if (ret < 0)
 		goto err_dpcd_read;
-	tc->link.coding8b10b = tmp[0] & BIT(0);
+
 	tc->link.scrambler_dis = 0;
 	/* read assr */
 	ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, tmp);
@@ -649,7 +645,6 @@ static int tc_get_display_props(struct tc_data *tc)
 		tc->link.base.num_lanes,
 		(tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ?
 		"enhanced" : "non-enhanced");
-	dev_dbg(tc->dev, "ANSI 8B/10B: %d\n", tc->link.coding8b10b);
 	dev_dbg(tc->dev, "Display ASSR: %d, TC358767 ASSR: %d\n",
 		tc->link.assr, tc->assr);
 
@@ -951,7 +946,7 @@ static int tc_main_link_setup(struct tc_data *tc)
 	/* DOWNSPREAD_CTRL */
 	tmp[0] = tc->link.spread ? DP_SPREAD_AMP_0_5 : 0x00;
 	/* MAIN_LINK_CHANNEL_CODING_SET */
-	tmp[1] =  tc->link.coding8b10b ? DP_SET_ANSI_8B10B : 0x00;
+	tmp[1] =  DP_SET_ANSI_8B10B;
 	ret = drm_dp_dpcd_write(aux, DP_DOWNSPREAD_CTRL, tmp, 2);
 	if (ret < 0)
 		goto err_dpcd_write;
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 04/24] drm/bridge: tc358767: cleanup spread & scrambler_dis
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (2 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 03/24] drm/bridge: tc358767: fix ansi 8b10b use Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 05/24] drm/bridge: tc358767: remove unused swing & preemp Tomi Valkeinen
                     ` (20 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Minor cleanups:
- Use bool for boolean fields
- Use DP_MAX_DOWNSPREAD_0_5 instead of BIT(0)
- debug print down-spread and scrambler status

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 33e27dc2f0b4..c4d9834d4b32 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -186,8 +186,8 @@ module_param_named(test, tc_test_pattern, bool, 0644);
 struct tc_edp_link {
 	struct drm_dp_link	base;
 	u8			assr;
-	int			scrambler_dis;
-	int			spread;
+	bool			scrambler_dis;
+	bool			spread;
 	u8			swing;
 	u8			preemp;
 };
@@ -626,13 +626,13 @@ static int tc_get_display_props(struct tc_data *tc)
 	ret = drm_dp_dpcd_readb(&tc->aux, DP_MAX_DOWNSPREAD, tmp);
 	if (ret < 0)
 		goto err_dpcd_read;
-	tc->link.spread = tmp[0] & BIT(0); /* 0.5% down spread */
+	tc->link.spread = tmp[0] & DP_MAX_DOWNSPREAD_0_5;
 
 	ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, tmp);
 	if (ret < 0)
 		goto err_dpcd_read;
 
-	tc->link.scrambler_dis = 0;
+	tc->link.scrambler_dis = false;
 	/* read assr */
 	ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, tmp);
 	if (ret < 0)
@@ -645,6 +645,9 @@ static int tc_get_display_props(struct tc_data *tc)
 		tc->link.base.num_lanes,
 		(tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ?
 		"enhanced" : "non-enhanced");
+	dev_dbg(tc->dev, "Downspread: %s, scrambler: %s\n",
+		tc->link.spread ? "0.5%" : "0.0%",
+		tc->link.scrambler_dis ? "disabled" : "enabled");
 	dev_dbg(tc->dev, "Display ASSR: %d, TC358767 ASSR: %d\n",
 		tc->link.assr, tc->assr);
 
@@ -934,7 +937,7 @@ static int tc_main_link_setup(struct tc_data *tc)
 			dev_dbg(dev, "Failed to switch display ASSR to %d, falling back to unscrambled mode\n",
 				 tc->assr);
 			/* trying with disabled scrambler */
-			tc->link.scrambler_dis = 1;
+			tc->link.scrambler_dis = true;
 		}
 	}
 
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 05/24] drm/bridge: tc358767: remove unused swing & preemp
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (3 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 04/24] drm/bridge: tc358767: cleanup spread & scrambler_dis Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 06/24] drm/bridge: tc358767: cleanup aux_link_setup Tomi Valkeinen
                     ` (19 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

swing and preemp fields are not used. Remove them.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index c4d9834d4b32..119cd8d14d4b 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -188,8 +188,6 @@ struct tc_edp_link {
 	u8			assr;
 	bool			scrambler_dis;
 	bool			spread;
-	u8			swing;
-	u8			preemp;
 };
 
 struct tc_data {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 06/24] drm/bridge: tc358767: cleanup aux_link_setup
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (4 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 05/24] drm/bridge: tc358767: remove unused swing & preemp Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 07/24] drm/bridge: tc358767: move video stream setup to tc_main_link_stream Tomi Valkeinen
                     ` (18 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

The driver sets up AUX link at probe time, but, for some reason, also
sets the main link's number of lanes using tc->link.base.num_lanes. This
is not needed nor correct, as the number of lanes has not been decided
yet. The number of lanes will be set later during main link setup.

Modify aux_link_setup so that it does not use tc->link, and thus makes
aux setup independent of the link probing.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 119cd8d14d4b..39a9de880e5a 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -542,7 +542,6 @@ static int tc_aux_link_setup(struct tc_data *tc)
 	unsigned long rate;
 	u32 value;
 	int ret;
-	u32 dp_phy_ctrl;
 
 	rate = clk_get_rate(tc->refclk);
 	switch (rate) {
@@ -567,10 +566,7 @@ static int tc_aux_link_setup(struct tc_data *tc)
 	value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
 	tc_write(SYS_PLLPARAM, value);
 
-	dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN;
-	if (tc->link.base.num_lanes == 2)
-		dp_phy_ctrl |= PHY_2LANE;
-	tc_write(DP_PHY_CTRL, dp_phy_ctrl);
+	tc_write(DP_PHY_CTRL, BGREN | PWR_SW_EN | PHY_A0_EN);
 
 	/*
 	 * Initially PLLs are in bypass. Force PLL parameter update,
@@ -587,8 +583,9 @@ static int tc_aux_link_setup(struct tc_data *tc)
 	if (ret == -ETIMEDOUT) {
 		dev_err(tc->dev, "Timeout waiting for PHY to become ready");
 		return ret;
-	} else if (ret)
+	} else if (ret) {
 		goto err;
+	}
 
 	/* Setup AUX link */
 	tc_write(DP0_AUXCFG1, AUX_RX_FILTER_EN |
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 07/24] drm/bridge: tc358767: move video stream setup to tc_main_link_stream
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (5 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 06/24] drm/bridge: tc358767: cleanup aux_link_setup Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 08/24] drm/bridge: tc358767: split stream enable/disable Tomi Valkeinen
                     ` (17 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

The driver currently sets the video stream registers in
tc_main_link_setup. One should be able to establish the DP link without
any video stream, so a more logical place is to configure the stream in
the tc_main_link_stream. So move them there.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 39a9de880e5a..4de21c3883d8 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1004,15 +1004,6 @@ static int tc_main_link_setup(struct tc_data *tc)
 		return -EAGAIN;
 	}
 
-	ret = tc_set_video_mode(tc, tc->mode);
-	if (ret)
-		goto err;
-
-	/* Set M/N */
-	ret = tc_stream_clock_calc(tc);
-	if (ret)
-		goto err;
-
 	return 0;
 err_dpcd_read:
 	dev_err(tc->dev, "Failed to read DPCD: %d\n", ret);
@@ -1031,6 +1022,15 @@ static int tc_main_link_stream(struct tc_data *tc, int state)
 	dev_dbg(tc->dev, "stream: %d\n", state);
 
 	if (state) {
+		ret = tc_set_video_mode(tc, tc->mode);
+		if (ret)
+			goto err;
+
+		/* Set M/N */
+		ret = tc_stream_clock_calc(tc);
+		if (ret)
+			goto err;
+
 		value = VID_MN_GEN | DP_EN;
 		if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
 			value |= EF_EN;
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 08/24] drm/bridge: tc358767: split stream enable/disable
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (6 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 07/24] drm/bridge: tc358767: move video stream setup to tc_main_link_stream Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 09/24] drm/bridge: tc358767: move PXL PLL enable/disable to " Tomi Valkeinen
                     ` (16 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

It is nicer to have enable/disable functions instead of set(bool enable)
style function.

Split tc_main_link_stream into tc_stream_enable and tc_stream_disable.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 81 +++++++++++++++++--------------
 1 file changed, 45 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 4de21c3883d8..a379b6368157 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1014,47 +1014,56 @@ static int tc_main_link_setup(struct tc_data *tc)
 	return ret;
 }
 
-static int tc_main_link_stream(struct tc_data *tc, int state)
+static int tc_stream_enable(struct tc_data *tc)
 {
 	int ret;
 	u32 value;
 
-	dev_dbg(tc->dev, "stream: %d\n", state);
+	dev_dbg(tc->dev, "enable video stream\n");
 
-	if (state) {
-		ret = tc_set_video_mode(tc, tc->mode);
-		if (ret)
-			goto err;
+	ret = tc_set_video_mode(tc, tc->mode);
+	if (ret)
+		return ret;
 
-		/* Set M/N */
-		ret = tc_stream_clock_calc(tc);
-		if (ret)
-			goto err;
+	/* Set M/N */
+	ret = tc_stream_clock_calc(tc);
+	if (ret)
+		return ret;
 
-		value = VID_MN_GEN | DP_EN;
-		if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
-			value |= EF_EN;
-		tc_write(DP0CTL, value);
-		/*
-		 * VID_EN assertion should be delayed by at least N * LSCLK
-		 * cycles from the time VID_MN_GEN is enabled in order to
-		 * generate stable values for VID_M. LSCLK is 270 MHz or
-		 * 162 MHz, VID_N is set to 32768 in  tc_stream_clock_calc(),
-		 * so a delay of at least 203 us should suffice.
-		 */
-		usleep_range(500, 1000);
-		value |= VID_EN;
-		tc_write(DP0CTL, value);
-		/* Set input interface */
-		value = DP0_AUDSRC_NO_INPUT;
-		if (tc_test_pattern)
-			value |= DP0_VIDSRC_COLOR_BAR;
-		else
-			value |= DP0_VIDSRC_DPI_RX;
-		tc_write(SYSCTRL, value);
-	} else {
-		tc_write(DP0CTL, 0);
-	}
+	value = VID_MN_GEN | DP_EN;
+	if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING)
+		value |= EF_EN;
+	tc_write(DP0CTL, value);
+	/*
+	 * VID_EN assertion should be delayed by at least N * LSCLK
+	 * cycles from the time VID_MN_GEN is enabled in order to
+	 * generate stable values for VID_M. LSCLK is 270 MHz or
+	 * 162 MHz, VID_N is set to 32768 in  tc_stream_clock_calc(),
+	 * so a delay of at least 203 us should suffice.
+	 */
+	usleep_range(500, 1000);
+	value |= VID_EN;
+	tc_write(DP0CTL, value);
+	/* Set input interface */
+	value = DP0_AUDSRC_NO_INPUT;
+	if (tc_test_pattern)
+		value |= DP0_VIDSRC_COLOR_BAR;
+	else
+		value |= DP0_VIDSRC_DPI_RX;
+	tc_write(SYSCTRL, value);
+
+	return 0;
+err:
+	return ret;
+}
+
+static int tc_stream_disable(struct tc_data *tc)
+{
+	int ret;
+
+	dev_dbg(tc->dev, "disable video stream\n");
+
+	tc_write(DP0CTL, 0);
 
 	return 0;
 err:
@@ -1079,7 +1088,7 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
 		return;
 	}
 
-	ret = tc_main_link_stream(tc, 1);
+	ret = tc_stream_enable(tc);
 	if (ret < 0) {
 		dev_err(tc->dev, "main link stream start error: %d\n", ret);
 		return;
@@ -1095,7 +1104,7 @@ static void tc_bridge_disable(struct drm_bridge *bridge)
 
 	drm_panel_disable(tc->panel);
 
-	ret = tc_main_link_stream(tc, 0);
+	ret = tc_stream_disable(tc);
 	if (ret < 0)
 		dev_err(tc->dev, "main link stream stop error: %d\n", ret);
 }
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 09/24] drm/bridge: tc358767: move PXL PLL enable/disable to stream enable/disable
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (7 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 08/24] drm/bridge: tc358767: split stream enable/disable Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 10/24] drm/bridge: tc358767: add link disable function Tomi Valkeinen
                     ` (15 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

We set up the PXL PLL inside tc_main_link_setup. This is unnecessary,
and makes tc_main_link_setup depend on the video-mode, which should not
be the case. As PXL PLL is used only for the video stream (and only when
using the HW test pattern), let's move the PXL PLL setup into
tc_stream_enable.

Also, currently the PXL PLL is only disabled if the driver if removed.
Let's disable the PXL PLL when the stream is disabled.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index a379b6368157..46975676c88c 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -877,14 +877,6 @@ static int tc_main_link_setup(struct tc_data *tc)
 	tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN);
 	tc_wait_pll_lock(tc);
 
-	/* PXL PLL setup */
-	if (tc_test_pattern) {
-		ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk),
-				    1000 * tc->mode->clock);
-		if (ret)
-			goto err;
-	}
-
 	/* Reset/Enable Main Links */
 	dp_phy_ctrl |= DP_PHY_RST | PHY_M1_RST | PHY_M0_RST;
 	tc_write(DP_PHY_CTRL, dp_phy_ctrl);
@@ -1021,6 +1013,14 @@ static int tc_stream_enable(struct tc_data *tc)
 
 	dev_dbg(tc->dev, "enable video stream\n");
 
+	/* PXL PLL setup */
+	if (tc_test_pattern) {
+		ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk),
+				    1000 * tc->mode->clock);
+		if (ret)
+			goto err;
+	}
+
 	ret = tc_set_video_mode(tc, tc->mode);
 	if (ret)
 		return ret;
@@ -1065,6 +1065,8 @@ static int tc_stream_disable(struct tc_data *tc)
 
 	tc_write(DP0CTL, 0);
 
+	tc_pxl_pll_dis(tc);
+
 	return 0;
 err:
 	return ret;
@@ -1391,8 +1393,6 @@ static int tc_remove(struct i2c_client *client)
 	drm_bridge_remove(&tc->bridge);
 	drm_dp_aux_unregister(&tc->aux);
 
-	tc_pxl_pll_dis(tc);
-
 	return 0;
 }
 
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 10/24] drm/bridge: tc358767: add link disable function
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (8 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 09/24] drm/bridge: tc358767: move PXL PLL enable/disable to " Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 11/24] drm/bridge: tc358767: disable only video stream in tc_stream_disable Tomi Valkeinen
                     ` (14 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Currently we have tc_main_link_setup(), which configures and enabled the
link, but we have no counter-part for disabling the link.

Add tc_main_link_disable, and rename tc_main_link_setup to
tc_main_link_enable.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 46975676c88c..2323a22656e8 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -822,7 +822,7 @@ static int tc_link_training(struct tc_data *tc, int pattern)
 	return ret;
 }
 
-static int tc_main_link_setup(struct tc_data *tc)
+static int tc_main_link_enable(struct tc_data *tc)
 {
 	struct drm_dp_aux *aux = &tc->aux;
 	struct device *dev = tc->dev;
@@ -837,6 +837,8 @@ static int tc_main_link_setup(struct tc_data *tc)
 	if (!tc->mode)
 		return -EINVAL;
 
+	dev_dbg(tc->dev, "link enable\n");
+
 	tc_write(DP0_SRCCTRL, tc_srcctrl(tc));
 	/* SSCG and BW27 on DP1 must be set to the same as on DP0 */
 	tc_write(DP1_SRCCTRL,
@@ -1006,6 +1008,20 @@ static int tc_main_link_setup(struct tc_data *tc)
 	return ret;
 }
 
+static int tc_main_link_disable(struct tc_data *tc)
+{
+	int ret;
+
+	dev_dbg(tc->dev, "link disable\n");
+
+	tc_write(DP0_SRCCTRL, 0);
+	tc_write(DP0CTL, 0);
+
+	return 0;
+err:
+	return ret;
+}
+
 static int tc_stream_enable(struct tc_data *tc)
 {
 	int ret;
@@ -1084,15 +1100,16 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
 	struct tc_data *tc = bridge_to_tc(bridge);
 	int ret;
 
-	ret = tc_main_link_setup(tc);
+	ret = tc_main_link_enable(tc);
 	if (ret < 0) {
-		dev_err(tc->dev, "main link setup error: %d\n", ret);
+		dev_err(tc->dev, "main link enable error: %d\n", ret);
 		return;
 	}
 
 	ret = tc_stream_enable(tc);
 	if (ret < 0) {
 		dev_err(tc->dev, "main link stream start error: %d\n", ret);
+		tc_main_link_disable(tc);
 		return;
 	}
 
@@ -1109,6 +1126,10 @@ static void tc_bridge_disable(struct drm_bridge *bridge)
 	ret = tc_stream_disable(tc);
 	if (ret < 0)
 		dev_err(tc->dev, "main link stream stop error: %d\n", ret);
+
+	ret = tc_main_link_disable(tc);
+	if (ret < 0)
+		dev_err(tc->dev, "main link disable error: %d\n", ret);
 }
 
 static void tc_bridge_post_disable(struct drm_bridge *bridge)
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 11/24] drm/bridge: tc358767: disable only video stream in tc_stream_disable
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (9 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 10/24] drm/bridge: tc358767: add link disable function Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 12/24] drm/bridge: tc358767: ensure DP is disabled before LT Tomi Valkeinen
                     ` (13 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Currently the code writes 0 to DP0CTL in tc_stream_disable(), which
disables the whole DP link instead of just the video stream. We always
disable the link and the stream together from tc_bridge_disable(), so
this doesn't cause any issues.

Nevertheless, fix this by only clearing VID_EN in tc_stream_disable to
stop the video stream while keeping the link enabled.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 2323a22656e8..f004db06dee9 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1076,10 +1076,13 @@ static int tc_stream_enable(struct tc_data *tc)
 static int tc_stream_disable(struct tc_data *tc)
 {
 	int ret;
+	u32 val;
 
 	dev_dbg(tc->dev, "disable video stream\n");
 
-	tc_write(DP0CTL, 0);
+	tc_read(DP0CTL, &val);
+	val &= ~VID_EN;
+	tc_write(DP0CTL, val);
 
 	tc_pxl_pll_dis(tc);
 
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 12/24] drm/bridge: tc358767: ensure DP is disabled before LT
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (10 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 11/24] drm/bridge: tc358767: disable only video stream in tc_stream_disable Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 13/24] drm/bridge: tc358767: remove unnecessary msleep Tomi Valkeinen
                     ` (12 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Link training will sometimes fail if the DP link is enabled when
tc_main_link_enable() is called. The driver makes sure the DP link is
disabled when the DP output is disabled, and we never enable the DP
without first disabling it, so this should never happen.

However, as the HW behavior seems to be somewhat random if DP link has
erroneously been left enabled, let's add a WARN_ON() for the case and
set DP0CTL to 0.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index f004db06dee9..ccf4c8cfbb52 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -839,6 +839,10 @@ static int tc_main_link_enable(struct tc_data *tc)
 
 	dev_dbg(tc->dev, "link enable\n");
 
+	tc_read(DP0CTL, &value);
+	if (WARN_ON(value & DP_EN))
+		tc_write(DP0CTL, 0);
+
 	tc_write(DP0_SRCCTRL, tc_srcctrl(tc));
 	/* SSCG and BW27 on DP1 must be set to the same as on DP0 */
 	tc_write(DP1_SRCCTRL,
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 13/24] drm/bridge: tc358767: remove unnecessary msleep
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (11 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 12/24] drm/bridge: tc358767: ensure DP is disabled before LT Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 14/24] drm/bridge: tc358767: use more reliable seq when finishing LT Tomi Valkeinen
                     ` (11 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

For some reason the driver has a msleep(100) after writing to
DP_PHY_CTRL. Toshiba's documentation doesn't suggest any delay is
needed, and I have not seen any issues with the sleep removed.

Drop it, as msleep(100) is a rather big one.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index ccf4c8cfbb52..a60a2e65e468 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -874,7 +874,6 @@ static int tc_main_link_enable(struct tc_data *tc)
 	if (tc->link.base.num_lanes == 2)
 		dp_phy_ctrl |= PHY_2LANE;
 	tc_write(DP_PHY_CTRL, dp_phy_ctrl);
-	msleep(100);
 
 	/* PLL setup */
 	tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 14/24] drm/bridge: tc358767: use more reliable seq when finishing LT
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (12 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 13/24] drm/bridge: tc358767: remove unnecessary msleep Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 15/24] drm/bridge: tc358767: cleanup LT result check Tomi Valkeinen
                     ` (10 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

At the end of the link training, two steps have to be taken: 1)
tc358767's LT mode is disabled by a write to DP0_SRCCTRL, and 2) Remove
LT flag in DPCD 0x102.

Toshiba's documentation tells to first write the DPCD, then modify
DP0_SRCCTRL. In my testing this often causes issues, and the link
disconnects right after those steps.

If I reverse the steps, it works every time. There's a chance that this
is DP sink specific, though, but as my testing shows this sequence to be
much more reliable, let's change it.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index a60a2e65e468..40f3efcade50 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -961,6 +961,18 @@ static int tc_main_link_enable(struct tc_data *tc)
 	if (ret)
 		goto err;
 
+	/*
+	 * Toshiba's documentation suggests to first clear DPCD 0x102, then
+	 * clear the training pattern bit in DP0_SRCCTRL. Testing shows
+	 * that the link sometimes drops if those steps are done in that order,
+	 * but if the steps are done in reverse order, the link stays up.
+	 *
+	 * So we do the steps differently than documented here.
+	 */
+
+	/* Clear Training Pattern, set AutoCorrect Mode = 1 */
+	tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_AUTOCORRECT);
+
 	/* Clear DPCD 0x102 */
 	/* Note: Can Not use DP0_SNKLTCTRL (0x06E4) short cut */
 	tmp[0] = tc->link.scrambler_dis ? DP_LINK_SCRAMBLING_DISABLE : 0x00;
@@ -968,9 +980,6 @@ static int tc_main_link_enable(struct tc_data *tc)
 	if (ret < 0)
 		goto err_dpcd_write;
 
-	/* Clear Training Pattern, set AutoCorrect Mode = 1 */
-	tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_AUTOCORRECT);
-
 	/* Wait */
 	timeout = 100;
 	do {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 15/24] drm/bridge: tc358767: cleanup LT result check
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (13 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 14/24] drm/bridge: tc358767: use more reliable seq when finishing LT Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 16/24] drm/bridge: tc358767: clean-up link training Tomi Valkeinen
                     ` (9 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

The driver has a loop after ending link training, where it reads the
DPCD link status and prints an error if that status is not ok.

The loop is unnecessary, as far as I can understand from DP specs, so
let's remove it. We can also print the more specific errors to help
debugging.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 62 +++++++++++++++++--------------
 1 file changed, 35 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 40f3efcade50..d79b1d0ca0db 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -980,34 +980,42 @@ static int tc_main_link_enable(struct tc_data *tc)
 	if (ret < 0)
 		goto err_dpcd_write;
 
-	/* Wait */
-	timeout = 100;
-	do {
-		udelay(1);
-		/* Read DPCD 0x202-0x207 */
-		ret = drm_dp_dpcd_read_link_status(aux, tmp + 2);
-		if (ret < 0)
-			goto err_dpcd_read;
-	} while ((--timeout) &&
-		 !(drm_dp_channel_eq_ok(tmp + 2,  tc->link.base.num_lanes)));
+	/* Check link status */
+	ret = drm_dp_dpcd_read_link_status(aux, tmp);
+	if (ret < 0)
+		goto err_dpcd_read;
 
-	if (timeout == 0) {
-		/* Read DPCD 0x200-0x201 */
-		ret = drm_dp_dpcd_read(aux, DP_SINK_COUNT, tmp, 2);
-		if (ret < 0)
-			goto err_dpcd_read;
-		dev_err(dev, "channel(s) EQ not ok\n");
-		dev_info(dev, "0x0200 SINK_COUNT: 0x%02x\n", tmp[0]);
-		dev_info(dev, "0x0201 DEVICE_SERVICE_IRQ_VECTOR: 0x%02x\n",
-			 tmp[1]);
-		dev_info(dev, "0x0202 LANE0_1_STATUS: 0x%02x\n", tmp[2]);
-		dev_info(dev, "0x0204 LANE_ALIGN_STATUS_UPDATED: 0x%02x\n",
-			 tmp[4]);
-		dev_info(dev, "0x0205 SINK_STATUS: 0x%02x\n", tmp[5]);
-		dev_info(dev, "0x0206 ADJUST_REQUEST_LANE0_1: 0x%02x\n",
-			 tmp[6]);
-
-		return -EAGAIN;
+	ret = 0;
+
+	value = tmp[0] & DP_CHANNEL_EQ_BITS;
+
+	if (value != DP_CHANNEL_EQ_BITS) {
+		dev_err(tc->dev, "Lane 0 failed: %x\n", value);
+		ret = -ENODEV;
+	}
+
+	if (tc->link.base.num_lanes == 2) {
+		value = (tmp[0] >> 4) & DP_CHANNEL_EQ_BITS;
+
+		if (value != DP_CHANNEL_EQ_BITS) {
+			dev_err(tc->dev, "Lane 1 failed: %x\n", value);
+			ret = -ENODEV;
+		}
+
+		if (!(tmp[2] & DP_INTERLANE_ALIGN_DONE)) {
+			dev_err(tc->dev, "Interlane align failed\n");
+			ret = -ENODEV;
+		}
+	}
+
+	if (ret) {
+		dev_err(dev, "0x0202 LANE0_1_STATUS:            0x%02x\n", tmp[0]);
+		dev_err(dev, "0x0203 LANE2_3_STATUS             0x%02x\n", tmp[1]);
+		dev_err(dev, "0x0204 LANE_ALIGN_STATUS_UPDATED: 0x%02x\n", tmp[2]);
+		dev_err(dev, "0x0205 SINK_STATUS:               0x%02x\n", tmp[3]);
+		dev_err(dev, "0x0206 ADJUST_REQUEST_LANE0_1:    0x%02x\n", tmp[4]);
+		dev_err(dev, "0x0207 ADJUST_REQUEST_LANE2_3:    0x%02x\n", tmp[5]);
+		goto err;
 	}
 
 	return 0;
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 16/24] drm/bridge: tc358767: clean-up link training
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (14 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 15/24] drm/bridge: tc358767: cleanup LT result check Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 17/24] drm/bridge: tc358767: remove check for video mode in link enable Tomi Valkeinen
                     ` (8 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

The current link training code does unnecessary retry-loops, and does
extra writes to the registers. It is easier to follow the flow and
ensure it's similar to Toshiba's documentation if we deal with LT inside
tc_main_link_enable() function.

This patch adds tc_wait_link_training() which handles waiting for the LT
phase to finish, and does the necessary LT register setups in
tc_main_link_enable, without extra loops.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 136 +++++++++++++-----------------
 1 file changed, 60 insertions(+), 76 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index d79b1d0ca0db..10a9b46de5f1 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -740,84 +740,24 @@ static int tc_set_video_mode(struct tc_data *tc,
 	return ret;
 }
 
-static int tc_link_training(struct tc_data *tc, int pattern)
+static int tc_wait_link_training(struct tc_data *tc)
 {
-	const char * const *errors;
-	u32 srcctrl = tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
-		      DP0_SRCCTRL_AUTOCORRECT;
-	int timeout;
-	int retry;
+	u32 timeout = 1000;
 	u32 value;
 	int ret;
 
-	if (pattern == DP_TRAINING_PATTERN_1) {
-		srcctrl |= DP0_SRCCTRL_TP1;
-		errors = training_pattern1_errors;
-	} else {
-		srcctrl |= DP0_SRCCTRL_TP2;
-		errors = training_pattern2_errors;
-	}
-
-	/* Set DPCD 0x102 for Training Part 1 or 2 */
-	tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE | pattern);
-
-	tc_write(DP0_LTLOOPCTRL,
-		 (0x0f << 28) |	/* Defer Iteration Count */
-		 (0x0f << 24) |	/* Loop Iteration Count */
-		 (0x0d << 0));	/* Loop Timer Delay */
-
-	retry = 5;
 	do {
-		/* Set DP0 Training Pattern */
-		tc_write(DP0_SRCCTRL, srcctrl);
-
-		/* Enable DP0 to start Link Training */
-		tc_write(DP0CTL, DP_EN);
-
-		/* wait */
-		timeout = 1000;
-		do {
-			tc_read(DP0_LTSTAT, &value);
-			udelay(1);
-		} while ((!(value & LT_LOOPDONE)) && (--timeout));
-		if (timeout == 0) {
-			dev_err(tc->dev, "Link training timeout!\n");
-		} else {
-			int pattern = (value >> 11) & 0x3;
-			int error = (value >> 8) & 0x7;
-
-			dev_dbg(tc->dev,
-				"Link training phase %d done after %d uS: %s\n",
-				pattern, 1000 - timeout, errors[error]);
-			if (pattern == DP_TRAINING_PATTERN_1 && error == 0)
-				break;
-			if (pattern == DP_TRAINING_PATTERN_2) {
-				value &= LT_CHANNEL1_EQ_BITS |
-					 LT_INTERLANE_ALIGN_DONE |
-					 LT_CHANNEL0_EQ_BITS;
-				/* in case of two lanes */
-				if ((tc->link.base.num_lanes == 2) &&
-				    (value == (LT_CHANNEL1_EQ_BITS |
-					       LT_INTERLANE_ALIGN_DONE |
-					       LT_CHANNEL0_EQ_BITS)))
-					break;
-				/* in case of one line */
-				if ((tc->link.base.num_lanes == 1) &&
-				    (value == (LT_INTERLANE_ALIGN_DONE |
-					       LT_CHANNEL0_EQ_BITS)))
-					break;
-			}
-		}
-		/* restart */
-		tc_write(DP0CTL, 0);
-		usleep_range(10, 20);
-	} while (--retry);
-	if (retry == 0) {
-		dev_err(tc->dev, "Failed to finish training phase %d\n",
-			pattern);
+		udelay(1);
+		tc_read(DP0_LTSTAT, &value);
+	} while ((!(value & LT_LOOPDONE)) && (--timeout));
+
+	if (timeout == 0) {
+		dev_err(tc->dev, "Link training timeout waiting for LT_LOOPDONE!\n");
+		return -ETIMEDOUT;
 	}
 
-	return 0;
+	return (value >> 8) & 0x7;
+
 err:
 	return ret;
 }
@@ -927,7 +867,7 @@ static int tc_main_link_enable(struct tc_data *tc)
 
 		if (tmp[0] != tc->assr) {
 			dev_dbg(dev, "Failed to switch display ASSR to %d, falling back to unscrambled mode\n",
-				 tc->assr);
+				tc->assr);
 			/* trying with disabled scrambler */
 			tc->link.scrambler_dis = true;
 		}
@@ -953,13 +893,57 @@ static int tc_main_link_enable(struct tc_data *tc)
 	if (ret < 0)
 		goto err_dpcd_write;
 
-	ret = tc_link_training(tc, DP_TRAINING_PATTERN_1);
-	if (ret)
+	/* Clock-Recovery */
+
+	/* Set DPCD 0x102 for Training Pattern 1 */
+	tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE |
+		 DP_TRAINING_PATTERN_1);
+
+	tc_write(DP0_LTLOOPCTRL,
+		 (15 << 28) |	/* Defer Iteration Count */
+		 (15 << 24) |	/* Loop Iteration Count */
+		 (0xd << 0));	/* Loop Timer Delay */
+
+	tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
+		 DP0_SRCCTRL_AUTOCORRECT | DP0_SRCCTRL_TP1);
+
+	/* Enable DP0 to start Link Training */
+	tc_write(DP0CTL,
+		 ((tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ? EF_EN : 0) |
+		 DP_EN);
+
+	/* wait */
+	ret = tc_wait_link_training(tc);
+	if (ret < 0)
 		goto err;
 
-	ret = tc_link_training(tc, DP_TRAINING_PATTERN_2);
-	if (ret)
+	if (ret) {
+		dev_err(tc->dev, "Link training phase 1 failed: %s\n",
+			training_pattern1_errors[ret]);
+		ret = -ENODEV;
 		goto err;
+	}
+
+	/* Channel Equalization */
+
+	/* Set DPCD 0x102 for Training Pattern 2 */
+	tc_write(DP0_SNKLTCTRL, DP_LINK_SCRAMBLING_DISABLE |
+		 DP_TRAINING_PATTERN_2);
+
+	tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS |
+		 DP0_SRCCTRL_AUTOCORRECT | DP0_SRCCTRL_TP2);
+
+	/* wait */
+	ret = tc_wait_link_training(tc);
+	if (ret < 0)
+		goto err;
+
+	if (ret) {
+		dev_err(tc->dev, "Link training phase 2 failed: %s\n",
+			training_pattern2_errors[ret]);
+		ret = -ENODEV;
+		goto err;
+	}
 
 	/*
 	 * Toshiba's documentation suggests to first clear DPCD 0x102, then
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 17/24] drm/bridge: tc358767: remove check for video mode in link enable
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (15 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 16/24] drm/bridge: tc358767: clean-up link training Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 18/24] drm/bridge: tc358767: use bridge mode_valid Tomi Valkeinen
                     ` (7 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

tc_main_link_enable() checks if videomode has been set, and fails if
there's no videomode. As tc_main_link_enable() no longer depends on the
videomode, we can drop the check.

Also, while tc_stream_enable() does depend on the videomode, we can
expect that a mode has been set before drm_bridge_funcs.enable is
called, so we don't need the check there either.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 10a9b46de5f1..604e54b90b79 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -773,10 +773,6 @@ static int tc_main_link_enable(struct tc_data *tc)
 	int ret;
 	u8 tmp[8];
 
-	/* display mode should be set at this point */
-	if (!tc->mode)
-		return -EINVAL;
-
 	dev_dbg(tc->dev, "link enable\n");
 
 	tc_read(DP0CTL, &value);
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 18/24] drm/bridge: tc358767: use bridge mode_valid
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (16 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 17/24] drm/bridge: tc358767: remove check for video mode in link enable Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 19/24] drm/bridge: tc358767: remove tc_connector_best_encoder Tomi Valkeinen
                     ` (6 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

We have tc_connector_mode_valid() to filter out videomdoes that the
tc358767 cannot support. As it is a bridge limitation, change the code
to use drm_bridge_funcs's mode_valid instead.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 604e54b90b79..9ebe78e9562d 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1154,10 +1154,10 @@ static bool tc_bridge_mode_fixup(struct drm_bridge *bridge,
 	return true;
 }
 
-static enum drm_mode_status tc_connector_mode_valid(struct drm_connector *connector,
-				   struct drm_display_mode *mode)
+static enum drm_mode_status tc_mode_valid(struct drm_bridge *bridge,
+					  const struct drm_display_mode *mode)
 {
-	struct tc_data *tc = connector_to_tc(connector);
+	struct tc_data *tc = bridge_to_tc(bridge);
 	u32 req, avail;
 	u32 bits_per_pixel = 24;
 
@@ -1226,7 +1226,6 @@ tc_connector_best_encoder(struct drm_connector *connector)
 
 static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
 	.get_modes = tc_connector_get_modes,
-	.mode_valid = tc_connector_mode_valid,
 	.best_encoder = tc_connector_best_encoder,
 };
 
@@ -1269,6 +1268,7 @@ static int tc_bridge_attach(struct drm_bridge *bridge)
 
 static const struct drm_bridge_funcs tc_bridge_funcs = {
 	.attach = tc_bridge_attach,
+	.mode_valid = tc_mode_valid,
 	.mode_set = tc_bridge_mode_set,
 	.pre_enable = tc_bridge_pre_enable,
 	.enable = tc_bridge_enable,
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 19/24] drm/bridge: tc358767: remove tc_connector_best_encoder
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (17 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 18/24] drm/bridge: tc358767: use bridge mode_valid Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 20/24] drm/bridge: tc358767: copy the mode data, instead of storing the pointer Tomi Valkeinen
                     ` (5 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

drm_connector_helper_funcs.best_encoder is only needed when the
connector can have more than one encoder, and that is never the case
here.

So remove tc_connector_best_encoder.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 9ebe78e9562d..83cb43af60e5 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1216,17 +1216,8 @@ static void tc_connector_set_polling(struct tc_data *tc,
 			    DRM_CONNECTOR_POLL_DISCONNECT;
 }
 
-static struct drm_encoder *
-tc_connector_best_encoder(struct drm_connector *connector)
-{
-	struct tc_data *tc = connector_to_tc(connector);
-
-	return tc->bridge.encoder;
-}
-
 static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
 	.get_modes = tc_connector_get_modes,
-	.best_encoder = tc_connector_best_encoder,
 };
 
 static const struct drm_connector_funcs tc_connector_funcs = {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 20/24] drm/bridge: tc358767: copy the mode data, instead of storing the pointer
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (18 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 19/24] drm/bridge: tc358767: remove tc_connector_best_encoder Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes() Tomi Valkeinen
                     ` (4 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

In tc_bridge_mode_set callback, we store the pointer to the given
drm_display_mode, and use the mode later. Storing a pointer in such a
way looks very suspicious to me, and I have observed odd issues where
the timings were apparently (at least mostly) zero.

Do a copy of the drm_display_mode instead to ensure we don't refer to
freed/modified data.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 83cb43af60e5..ffcbecf69d40 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -205,7 +205,7 @@ struct tc_data {
 	/* display edid */
 	struct edid		*edid;
 	/* current mode */
-	const struct drm_display_mode	*mode;
+	struct drm_display_mode	mode;
 
 	u32			rev;
 	u8			assr;
@@ -1032,12 +1032,12 @@ static int tc_stream_enable(struct tc_data *tc)
 	/* PXL PLL setup */
 	if (tc_test_pattern) {
 		ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk),
-				    1000 * tc->mode->clock);
+				    1000 * tc->mode.clock);
 		if (ret)
 			goto err;
 	}
 
-	ret = tc_set_video_mode(tc, tc->mode);
+	ret = tc_set_video_mode(tc, &tc->mode);
 	if (ret)
 		return ret;
 
@@ -1180,7 +1180,7 @@ static void tc_bridge_mode_set(struct drm_bridge *bridge,
 {
 	struct tc_data *tc = bridge_to_tc(bridge);
 
-	tc->mode = mode;
+	tc->mode = *mode;
 }
 
 static int tc_connector_get_modes(struct drm_connector *connector)
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes()
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (19 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 20/24] drm/bridge: tc358767: copy the mode data, instead of storing the pointer Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28 11:54     ` Andrzej Hajda
  2019-05-28  8:27   ` [PATCHv4 22/24] drm/bridge: tc358767: add GPIO & interrupt registers Tomi Valkeinen
                     ` (3 subsequent siblings)
  24 siblings, 1 reply; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

We need to know the link bandwidth to filter out modes we cannot
support, so we need to have read the display props before doing the
filtering.

To ensure we have up to date display props, call tc_get_display_props()
in the beginning of tc_connector_get_modes().

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index ffcbecf69d40..2b9d6046d76e 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -1188,6 +1188,13 @@ static int tc_connector_get_modes(struct drm_connector *connector)
 	struct tc_data *tc = connector_to_tc(connector);
 	struct edid *edid;
 	unsigned int count;
+	int ret;
+
+	ret = tc_get_display_props(tc);
+	if (ret < 0) {
+		dev_err(tc->dev, "failed to read display props: %d\n", ret);
+		return 0;
+	}
 
 	if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) {
 		count = tc->panel->funcs->get_modes(tc->panel);
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 22/24] drm/bridge: tc358767: add GPIO & interrupt registers
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (20 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes() Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-28  8:27   ` [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support Tomi Valkeinen
                     ` (2 subsequent siblings)
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Add GPIO and interrupt related registers for HPD work. Mark INTSTS_G and
GPIOI as volatile.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 2b9d6046d76e..b820a59ef29e 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -78,6 +78,12 @@
 #define DP0_VIDSRC_DSI_RX		(1 << 0)
 #define DP0_VIDSRC_DPI_RX		(2 << 0)
 #define DP0_VIDSRC_COLOR_BAR		(3 << 0)
+#define GPIOM			0x0540
+#define GPIOI			0x054c
+#define INTCTL_G		0x0560
+#define INTSTS_G		0x0564
+#define INT_GP0_LCNT		0x0584
+#define INT_GP1_LCNT		0x0588
 
 /* Control */
 #define DP0CTL			0x0600
@@ -1286,6 +1292,8 @@ static const struct regmap_range tc_volatile_ranges[] = {
 	regmap_reg_range(DP_PHY_CTRL, DP_PHY_CTRL),
 	regmap_reg_range(DP0_PLLCTRL, PXL_PLLCTRL),
 	regmap_reg_range(VFUEN0, VFUEN0),
+	regmap_reg_range(INTSTS_G, INTSTS_G),
+	regmap_reg_range(GPIOI, GPIOI),
 };
 
 static const struct regmap_access_table tc_volatile_table = {
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (21 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 22/24] drm/bridge: tc358767: add GPIO & interrupt registers Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-31 13:38     ` Andrzej Hajda
  2019-05-28  8:27   ` [PATCHv4 24/24] dt-bindings: tc358767: add " Tomi Valkeinen
  2019-05-31 13:53   ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Andrzej Hajda
  24 siblings, 1 reply; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: Tomi Valkeinen

Add support for interrupt and hotplug handling. Both are optional.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
---
 drivers/gpu/drm/bridge/tc358767.c | 163 ++++++++++++++++++++++++++----
 1 file changed, 145 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index b820a59ef29e..72666e07007a 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -71,6 +71,7 @@
 
 /* System */
 #define TC_IDREG		0x0500
+#define SYSSTAT			0x0508
 #define SYSCTRL			0x0510
 #define DP0_AUDSRC_NO_INPUT		(0 << 3)
 #define DP0_AUDSRC_I2S_RX		(1 << 3)
@@ -79,9 +80,16 @@
 #define DP0_VIDSRC_DPI_RX		(2 << 0)
 #define DP0_VIDSRC_COLOR_BAR		(3 << 0)
 #define GPIOM			0x0540
+#define GPIOC			0x0544
+#define GPIOO			0x0548
 #define GPIOI			0x054c
 #define INTCTL_G		0x0560
 #define INTSTS_G		0x0564
+
+#define INT_SYSERR		BIT(16)
+#define INT_GPIO_H(x)		(1 << (x == 0 ? 2 : 10))
+#define INT_GPIO_LC(x)		(1 << (x == 0 ? 3 : 11))
+
 #define INT_GP0_LCNT		0x0584
 #define INT_GP1_LCNT		0x0588
 
@@ -219,6 +227,12 @@ struct tc_data {
 	struct gpio_desc	*sd_gpio;
 	struct gpio_desc	*reset_gpio;
 	struct clk		*refclk;
+
+	/* do we have IRQ */
+	bool			have_irq;
+
+	/* HPD pin number (0 or 1) or -ENODEV */
+	int			hpd_pin;
 };
 
 static inline struct tc_data *aux_to_tc(struct drm_dp_aux *a)
@@ -1109,6 +1123,12 @@ static void tc_bridge_enable(struct drm_bridge *bridge)
 	struct tc_data *tc = bridge_to_tc(bridge);
 	int ret;
 
+	ret = tc_get_display_props(tc);
+	if (ret < 0) {
+		dev_err(tc->dev, "failed to read display props: %d\n", ret);
+		return;
+	}
+
 	ret = tc_main_link_enable(tc);
 	if (ret < 0) {
 		dev_err(tc->dev, "main link enable error: %d\n", ret);
@@ -1221,19 +1241,40 @@ static int tc_connector_get_modes(struct drm_connector *connector)
 	return count;
 }
 
-static void tc_connector_set_polling(struct tc_data *tc,
-				     struct drm_connector *connector)
-{
-	/* TODO: add support for HPD */
-	connector->polled = DRM_CONNECTOR_POLL_CONNECT |
-			    DRM_CONNECTOR_POLL_DISCONNECT;
-}
-
 static const struct drm_connector_helper_funcs tc_connector_helper_funcs = {
 	.get_modes = tc_connector_get_modes,
 };
 
+static enum drm_connector_status tc_connector_detect(struct drm_connector *connector,
+						     bool force)
+{
+	struct tc_data *tc = connector_to_tc(connector);
+	bool conn;
+	u32 val;
+	int ret;
+
+	if (tc->hpd_pin < 0) {
+		if (tc->panel)
+			return connector_status_connected;
+		else
+			return connector_status_unknown;
+	}
+
+	tc_read(GPIOI, &val);
+
+	conn = val & BIT(tc->hpd_pin);
+
+	if (conn)
+		return connector_status_connected;
+	else
+		return connector_status_disconnected;
+
+err:
+	return connector_status_unknown;
+}
+
 static const struct drm_connector_funcs tc_connector_funcs = {
+	.detect = tc_connector_detect,
 	.fill_modes = drm_helper_probe_single_connector_modes,
 	.destroy = drm_connector_cleanup,
 	.reset = drm_atomic_helper_connector_reset,
@@ -1248,7 +1289,7 @@ static int tc_bridge_attach(struct drm_bridge *bridge)
 	struct drm_device *drm = bridge->dev;
 	int ret;
 
-	/* Create eDP connector */
+	/* Create DP/eDP connector */
 	drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs);
 	ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs,
 				 tc->panel ? DRM_MODE_CONNECTOR_eDP :
@@ -1256,6 +1297,15 @@ static int tc_bridge_attach(struct drm_bridge *bridge)
 	if (ret)
 		return ret;
 
+	/* Don't poll if don't have HPD connected */
+	if (tc->hpd_pin >= 0) {
+		if (tc->have_irq)
+			tc->connector.polled = DRM_CONNECTOR_POLL_HPD;
+		else
+			tc->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
+					       DRM_CONNECTOR_POLL_DISCONNECT;
+	}
+
 	if (tc->panel)
 		drm_panel_attach(tc->panel, &tc->connector);
 
@@ -1322,6 +1372,49 @@ static const struct regmap_config tc_regmap_config = {
 	.val_format_endian = REGMAP_ENDIAN_LITTLE,
 };
 
+static irqreturn_t tc_irq_handler(int irq, void *arg)
+{
+	struct tc_data *tc = arg;
+	u32 val;
+	int r;
+
+	r = regmap_read(tc->regmap, INTSTS_G, &val);
+	if (r)
+		return IRQ_NONE;
+
+	if (!val)
+		return IRQ_NONE;
+
+	if (val & INT_SYSERR) {
+		u32 stat = 0;
+
+		regmap_read(tc->regmap, SYSSTAT, &stat);
+
+		dev_err(tc->dev, "syserr %x\n", stat);
+	}
+
+	if (tc->hpd_pin >= 0 && tc->bridge.dev) {
+		/*
+		 * H is triggered when the GPIO goes high.
+		 *
+		 * LC is triggered when the GPIO goes low and stays low for
+		 * the duration of LCNT
+		 */
+		bool h = val & INT_GPIO_H(tc->hpd_pin);
+		bool lc = val & INT_GPIO_LC(tc->hpd_pin);
+
+		dev_dbg(tc->dev, "GPIO%d: %s %s\n", tc->hpd_pin,
+			h ? "H" : "", lc ? "LC" : "");
+
+		if (h || lc)
+			drm_kms_helper_hotplug_event(tc->bridge.dev);
+	}
+
+	regmap_write(tc->regmap, INTSTS_G, val);
+
+	return IRQ_HANDLED;
+}
+
 static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
 	struct device *dev = &client->dev;
@@ -1373,6 +1466,33 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 		return ret;
 	}
 
+	ret = of_property_read_u32(dev->of_node, "toshiba,hpd-pin",
+				   &tc->hpd_pin);
+	if (ret) {
+		tc->hpd_pin = -ENODEV;
+	} else {
+		if (tc->hpd_pin < 0 || tc->hpd_pin > 1) {
+			dev_err(dev, "failed to parse HPD number\n");
+			return ret;
+		}
+	}
+
+	if (client->irq > 0) {
+		/* enable SysErr */
+		regmap_write(tc->regmap, INTCTL_G, INT_SYSERR);
+
+		ret = devm_request_threaded_irq(dev, client->irq,
+						NULL, tc_irq_handler,
+						IRQF_ONESHOT,
+						"tc358767-irq", tc);
+		if (ret) {
+			dev_err(dev, "failed to register dp interrupt\n");
+			return ret;
+		}
+
+		tc->have_irq = true;
+	}
+
 	ret = regmap_read(tc->regmap, TC_IDREG, &tc->rev);
 	if (ret) {
 		dev_err(tc->dev, "can not read device ID: %d\n", ret);
@@ -1386,6 +1506,22 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 
 	tc->assr = (tc->rev == 0x6601); /* Enable ASSR for eDP panels */
 
+	if (tc->hpd_pin >= 0) {
+		u32 lcnt_reg = tc->hpd_pin == 0 ? INT_GP0_LCNT : INT_GP1_LCNT;
+		u32 h_lc = INT_GPIO_H(tc->hpd_pin) | INT_GPIO_LC(tc->hpd_pin);
+
+		/* Set LCNT to 2ms */
+		regmap_write(tc->regmap, lcnt_reg,
+			     clk_get_rate(tc->refclk) * 2 / 1000);
+		/* We need the "alternate" mode for HPD */
+		regmap_write(tc->regmap, GPIOM, BIT(tc->hpd_pin));
+
+		if (tc->have_irq) {
+			/* enable H & LC */
+			regmap_update_bits(tc->regmap, INTCTL_G, h_lc, h_lc);
+		}
+	}
+
 	ret = tc_aux_link_setup(tc);
 	if (ret)
 		return ret;
@@ -1398,12 +1534,6 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	if (ret)
 		return ret;
 
-	ret = tc_get_display_props(tc);
-	if (ret)
-		goto err_unregister_aux;
-
-	tc_connector_set_polling(tc, &tc->connector);
-
 	tc->bridge.funcs = &tc_bridge_funcs;
 	tc->bridge.of_node = dev->of_node;
 	drm_bridge_add(&tc->bridge);
@@ -1411,9 +1541,6 @@ static int tc_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	i2c_set_clientdata(client, tc);
 
 	return 0;
-err_unregister_aux:
-	drm_dp_aux_unregister(&tc->aux);
-	return ret;
 }
 
 static int tc_remove(struct i2c_client *client)
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCHv4 24/24] dt-bindings: tc358767: add HPD support
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (22 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support Tomi Valkeinen
@ 2019-05-28  8:27   ` Tomi Valkeinen
  2019-05-31 13:53   ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Andrzej Hajda
  24 siblings, 0 replies; 28+ messages in thread
From: Tomi Valkeinen @ 2019-05-28  8:27 UTC (permalink / raw)
  To: dri-devel, Andrzej Hajda, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot
  Cc: devicetree, Tomi Valkeinen

Add DT property for defining the pin used for HPD.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: devicetree@vger.kernel.org
Cc: Rob Herring <robh@kernel.org>
Reviewed-by: Rob Herring <robh@kernel.org>
---
 .../devicetree/bindings/display/bridge/toshiba,tc358767.txt      | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.txt b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.txt
index e3f6aa6a214d..583c5e9dbe6b 100644
--- a/Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.txt
+++ b/Documentation/devicetree/bindings/display/bridge/toshiba,tc358767.txt
@@ -12,6 +12,7 @@ Optional properties:
                    (active high shutdown input)
  - reset-gpios: OF device-tree gpio specification for RSTX pin
                 (active low system reset)
+ - toshiba,hpd-pin: TC358767 GPIO pin number to which HPD is connected to (0 or 1)
  - ports: the ports node can contain video interface port nodes to connect
    to a DPI/DSI source and to an eDP/DP sink according to [1][2]:
     - port@0: DSI input port
-- 
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes()
  2019-05-28  8:27   ` [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes() Tomi Valkeinen
@ 2019-05-28 11:54     ` Andrzej Hajda
  0 siblings, 0 replies; 28+ messages in thread
From: Andrzej Hajda @ 2019-05-28 11:54 UTC (permalink / raw)
  To: Tomi Valkeinen, dri-devel, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot

On 28.05.2019 10:27, Tomi Valkeinen wrote:
> We need to know the link bandwidth to filter out modes we cannot
> support, so we need to have read the display props before doing the
> filtering.
>
> To ensure we have up to date display props, call tc_get_display_props()
> in the beginning of tc_connector_get_modes().
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>


Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>

 --
Regards
Andrzej

> ---
>  drivers/gpu/drm/bridge/tc358767.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
> index ffcbecf69d40..2b9d6046d76e 100644
> --- a/drivers/gpu/drm/bridge/tc358767.c
> +++ b/drivers/gpu/drm/bridge/tc358767.c
> @@ -1188,6 +1188,13 @@ static int tc_connector_get_modes(struct drm_connector *connector)
>  	struct tc_data *tc = connector_to_tc(connector);
>  	struct edid *edid;
>  	unsigned int count;
> +	int ret;
> +
> +	ret = tc_get_display_props(tc);
> +	if (ret < 0) {
> +		dev_err(tc->dev, "failed to read display props: %d\n", ret);
> +		return 0;
> +	}
>  
>  	if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) {
>  		count = tc->panel->funcs->get_modes(tc->panel);


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support
  2019-05-28  8:27   ` [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support Tomi Valkeinen
@ 2019-05-31 13:38     ` Andrzej Hajda
  0 siblings, 0 replies; 28+ messages in thread
From: Andrzej Hajda @ 2019-05-31 13:38 UTC (permalink / raw)
  To: Tomi Valkeinen, dri-devel, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot

On 28.05.2019 10:27, Tomi Valkeinen wrote:
> Add support for interrupt and hotplug handling. Both are optional.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>

Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>

 --
Regards
Andrzej


_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCHv4 00/24] drm/bridge: tc358767: DP support
  2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
                     ` (23 preceding siblings ...)
  2019-05-28  8:27   ` [PATCHv4 24/24] dt-bindings: tc358767: add " Tomi Valkeinen
@ 2019-05-31 13:53   ` Andrzej Hajda
  24 siblings, 0 replies; 28+ messages in thread
From: Andrzej Hajda @ 2019-05-31 13:53 UTC (permalink / raw)
  To: Tomi Valkeinen, dri-devel, Laurent Pinchart, Lucas Stach,
	Andrey Gusakov, Philipp Zabel, Andrey Smirnov, Peter Ujfalusi,
	Jyri Sarha, Benoit Parrot

On 28.05.2019 10:27, Tomi Valkeinen wrote:
> Hi,
>
> tc358767 bridge was originally implemented for eDP use with an embedded
> panel. I've been working to add DP and HPD support, and this series is
> the result. I did have a lot of issues with link training, but with
> these, it's been working reliably with my devices.
>
> Changes in v2
> * Drop "implement naive HPD handling", and implement HPD interrupt handling.
>
> Changes in v3
> * Various small comment, description and formatting changes
> * 'hpd-num' DT property renamed to 'toshiba,hpd-pin'
> * Check DP0CTL == 0 at the beginning of tc_main_link_enable
> * Disable only the video stream in tc_stream_disable()
> * Fix tc_connector_detect for eDP panels
>
> Changes in v4
> * Add "read display_props in get_modes()"
> * Remove the tc_get_display_props call from detect callback
> * Fix the DP0CTL check in tc_main_link_enable. Only check for DP_EN bit,
>   as we can have other bits set (e.g. after reset VID_MN_GEN is set)
> * Added some reviewed-bys
>
>  Tomi
>
> Tomi Valkeinen (24):
>   drm/bridge: tc358767: fix tc_aux_get_status error handling
>   drm/bridge: tc358767: reset voltage-swing & pre-emphasis
>   drm/bridge: tc358767: fix ansi 8b10b use
>   drm/bridge: tc358767: cleanup spread & scrambler_dis
>   drm/bridge: tc358767: remove unused swing & preemp
>   drm/bridge: tc358767: cleanup aux_link_setup
>   drm/bridge: tc358767: move video stream setup to tc_main_link_stream
>   drm/bridge: tc358767: split stream enable/disable
>   drm/bridge: tc358767: move PXL PLL enable/disable to stream
>     enable/disable
>   drm/bridge: tc358767: add link disable function
>   drm/bridge: tc358767: disable only video stream in tc_stream_disable
>   drm/bridge: tc358767: ensure DP is disabled before LT
>   drm/bridge: tc358767: remove unnecessary msleep
>   drm/bridge: tc358767: use more reliable seq when finishing LT
>   drm/bridge: tc358767: cleanup LT result check
>   drm/bridge: tc358767: clean-up link training
>   drm/bridge: tc358767: remove check for video mode in link enable
>   drm/bridge: tc358767: use bridge mode_valid
>   drm/bridge: tc358767: remove tc_connector_best_encoder
>   drm/bridge: tc358767: copy the mode data, instead of storing the
>     pointer
>   drm/bridge: tc358767: read display_props in get_modes()
>   drm/bridge: tc358767: add GPIO & interrupt registers
>   drm/bridge: tc358767: add IRQ and HPD support
>   dt-bindings: tc358767: add HPD support
>
>  .../display/bridge/toshiba,tc358767.txt       |   1 +
>  drivers/gpu/drm/bridge/tc358767.c             | 593 +++++++++++-------
>  2 files changed, 382 insertions(+), 212 deletions(-)


Queued to drm-misc-next.


Regards

Andrzej



>
> --
> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
>
>
>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2019-05-31 13:53 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CGME20190528082813epcas2p239d993a4286c0a41d2b17d026bf0288b@epcas2p2.samsung.com>
2019-05-28  8:27 ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 01/24] drm/bridge: tc358767: fix tc_aux_get_status error handling Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 02/24] drm/bridge: tc358767: reset voltage-swing & pre-emphasis Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 03/24] drm/bridge: tc358767: fix ansi 8b10b use Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 04/24] drm/bridge: tc358767: cleanup spread & scrambler_dis Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 05/24] drm/bridge: tc358767: remove unused swing & preemp Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 06/24] drm/bridge: tc358767: cleanup aux_link_setup Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 07/24] drm/bridge: tc358767: move video stream setup to tc_main_link_stream Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 08/24] drm/bridge: tc358767: split stream enable/disable Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 09/24] drm/bridge: tc358767: move PXL PLL enable/disable to " Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 10/24] drm/bridge: tc358767: add link disable function Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 11/24] drm/bridge: tc358767: disable only video stream in tc_stream_disable Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 12/24] drm/bridge: tc358767: ensure DP is disabled before LT Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 13/24] drm/bridge: tc358767: remove unnecessary msleep Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 14/24] drm/bridge: tc358767: use more reliable seq when finishing LT Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 15/24] drm/bridge: tc358767: cleanup LT result check Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 16/24] drm/bridge: tc358767: clean-up link training Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 17/24] drm/bridge: tc358767: remove check for video mode in link enable Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 18/24] drm/bridge: tc358767: use bridge mode_valid Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 19/24] drm/bridge: tc358767: remove tc_connector_best_encoder Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 20/24] drm/bridge: tc358767: copy the mode data, instead of storing the pointer Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 21/24] drm/bridge: tc358767: read display_props in get_modes() Tomi Valkeinen
2019-05-28 11:54     ` Andrzej Hajda
2019-05-28  8:27   ` [PATCHv4 22/24] drm/bridge: tc358767: add GPIO & interrupt registers Tomi Valkeinen
2019-05-28  8:27   ` [PATCHv4 23/24] drm/bridge: tc358767: add IRQ and HPD support Tomi Valkeinen
2019-05-31 13:38     ` Andrzej Hajda
2019-05-28  8:27   ` [PATCHv4 24/24] dt-bindings: tc358767: add " Tomi Valkeinen
2019-05-31 13:53   ` [PATCHv4 00/24] drm/bridge: tc358767: DP support Andrzej Hajda

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.