From mboxrd@z Thu Jan 1 00:00:00 1970 From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) Date: Tue, 04 Apr 2017 12:52:33 +0300 Subject: [PATCH v6 6/6] drm: bridge: dw-hdmi: Move HPD handling to PHY operations In-Reply-To: <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> References: <1491230558-10804-1-git-send-email-narmstrong@baylibre.com> <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> Message-ID: <2169094.E5ep7k9Agc@avalon> To: linus-amlogic@lists.infradead.org List-Id: linus-amlogic.lists.infradead.org Hi Neil, Thank you for the patch. On Monday 03 Apr 2017 16:42:38 Neil Armstrong wrote: > The HDMI TX controller support HPD and RXSENSE signaling from the PHY > via it's STAT0 PHY interface, but some vendor PHYs can manage these > signals independently from the controller, thus these STAT0 handling > should be moved to PHY specific operations and become optional. > > The existing STAT0 HPD and RXSENSE handling code is refactored into > a supplementaty set of default PHY operations that are used automatically > when the platform glue doesn't provide its own operations. > > Reviewed-by: Jose Abreu > Reviewed-by: Archit Taneja > Signed-off-by: Neil Armstrong Reviewed-by: Laurent Pinchart > --- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 135 +++++++++++++++------------ > include/drm/bridge/dw_hdmi.h | 5 ++ > 2 files changed, 86 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 16d5fff3..84cc949 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > @@ -1229,10 +1229,46 @@ static enum drm_connector_status > dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi, connector_status_connected : > connector_status_disconnected; > } > > +static void dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data, > + bool force, bool disabled, bool rxsense) > +{ > + u8 old_mask = hdmi->phy_mask; > + > + if (force || disabled || !rxsense) > + hdmi->phy_mask |= HDMI_PHY_RX_SENSE; > + else > + hdmi->phy_mask &= ~HDMI_PHY_RX_SENSE; > + > + if (old_mask != hdmi->phy_mask) > + hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > +} > + > +static void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data) > +{ > + /* > + * Configure the PHY RX SENSE and HPD interrupts polarities and clear > + * any pending interrupt. > + */ > + hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0); > + hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > + HDMI_IH_PHY_STAT0); > + > + /* Enable cable hot plug irq. */ > + hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > + > + /* Clear and unmute interrupts. */ > + hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > + HDMI_IH_PHY_STAT0); > + hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE), > + HDMI_IH_MUTE_PHY_STAT0); > +} > + > static const struct dw_hdmi_phy_ops dw_hdmi_synopsys_phy_ops = { > .init = dw_hdmi_phy_init, > .disable = dw_hdmi_phy_disable, > .read_hpd = dw_hdmi_phy_read_hpd, > + .update_hpd = dw_hdmi_phy_update_hpd, > + .setup_hpd = dw_hdmi_phy_setup_hpd, > }; > > /* ------------------------------------------------------------------------ > @@ -1808,35 +1844,10 @@ static void dw_hdmi_update_power(struct dw_hdmi > *hdmi) */ > static void dw_hdmi_update_phy_mask(struct dw_hdmi *hdmi) > { > - u8 old_mask = hdmi->phy_mask; > - > - if (hdmi->force || hdmi->disabled || !hdmi->rxsense) > - hdmi->phy_mask |= HDMI_PHY_RX_SENSE; > - else > - hdmi->phy_mask &= ~HDMI_PHY_RX_SENSE; > - > - if (old_mask != hdmi->phy_mask) > - hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > -} > - > -static void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi) > -{ > - /* > - * Configure the PHY RX SENSE and HPD interrupts polarities and clear > - * any pending interrupt. > - */ > - hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0); > - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > - HDMI_IH_PHY_STAT0); > - > - /* Enable cable hot plug irq. */ > - hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > - > - /* Clear and unmute interrupts. */ > - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > - HDMI_IH_PHY_STAT0); > - hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE), > - HDMI_IH_MUTE_PHY_STAT0); > + if (hdmi->phy.ops->update_hpd) > + hdmi->phy.ops->update_hpd(hdmi, hdmi->phy.data, > + hdmi->force, hdmi->disabled, > + hdmi->rxsense); > } > > static enum drm_connector_status > @@ -2028,6 +2039,41 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void > *dev_id) return ret; > } > > +void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool > rx_sense) +{ > + mutex_lock(&hdmi->mutex); > + > + if (!hdmi->force) { > + /* > + * If the RX sense status indicates we're disconnected, > + * clear the software rxsense status. > + */ > + if (!rx_sense) > + hdmi->rxsense = false; > + > + /* > + * Only set the software rxsense status when both > + * rxsense and hpd indicates we're connected. > + * This avoids what seems to be bad behaviour in > + * at least iMX6S versions of the phy. > + */ > + if (hpd) > + hdmi->rxsense = true; > + > + dw_hdmi_update_power(hdmi); > + dw_hdmi_update_phy_mask(hdmi); > + } > + mutex_unlock(&hdmi->mutex); > +} > + > +void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense) > +{ > + struct dw_hdmi *hdmi = dev_get_drvdata(dev); > + > + __dw_hdmi_setup_rx_sense(hdmi, hpd, rx_sense); > +} > +EXPORT_SYMBOL_GPL(dw_hdmi_setup_rx_sense); > + > static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) > { > struct dw_hdmi *hdmi = dev_id; > @@ -2060,30 +2106,10 @@ static irqreturn_t dw_hdmi_irq(int irq, void > *dev_id) * ask the source to re-read the EDID. > */ > if (intr_stat & > - (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) { > - mutex_lock(&hdmi->mutex); > - if (!hdmi->force) { > - /* > - * If the RX sense status indicates we're disconnected, > - * clear the software rxsense status. > - */ > - if (!(phy_stat & HDMI_PHY_RX_SENSE)) > - hdmi->rxsense = false; > - > - /* > - * Only set the software rxsense status when both > - * rxsense and hpd indicates we're connected. > - * This avoids what seems to be bad behaviour in > - * at least iMX6S versions of the phy. > - */ > - if (phy_stat & HDMI_PHY_HPD) > - hdmi->rxsense = true; > - > - dw_hdmi_update_power(hdmi); > - dw_hdmi_update_phy_mask(hdmi); > - } > - mutex_unlock(&hdmi->mutex); > - } > + (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) > + __dw_hdmi_setup_rx_sense(hdmi, > + phy_stat & HDMI_PHY_HPD, > + phy_stat & HDMI_PHY_RX_SENSE); > > if (intr_stat & HDMI_IH_PHY_STAT0_HPD) { > dev_dbg(hdmi->dev, "EVENT=%s\n", > @@ -2357,7 +2383,8 @@ static int dw_hdmi_detect_phy(struct dw_hdmi *hdmi) > #endif > > dw_hdmi_setup_i2c(hdmi); > - dw_hdmi_phy_setup_hpd(hdmi); > + if (hdmi->phy.ops->setup_hpd) > + hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data); > > memset(&pdevinfo, 0, sizeof(pdevinfo)); > pdevinfo.parent = dev; > diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h > index 45c2c15..e63d675 100644 > --- a/include/drm/bridge/dw_hdmi.h > +++ b/include/drm/bridge/dw_hdmi.h > @@ -117,6 +117,9 @@ struct dw_hdmi_phy_ops { > struct drm_display_mode *mode); > void (*disable)(struct dw_hdmi *hdmi, void *data); > enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data); > + void (*update_hpd)(struct dw_hdmi *hdmi, void *data, > + bool force, bool disabled, bool rxsense); > + void (*setup_hpd)(struct dw_hdmi *hdmi, void *data); > }; > > struct dw_hdmi_plat_data { > @@ -147,6 +150,8 @@ int dw_hdmi_probe(struct platform_device *pdev, > int dw_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, > const struct dw_hdmi_plat_data *plat_data); > > +void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense); > + > void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate); > void dw_hdmi_audio_enable(struct dw_hdmi *hdmi); > void dw_hdmi_audio_disable(struct dw_hdmi *hdmi); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v6 6/6] drm: bridge: dw-hdmi: Move HPD handling to PHY operations Date: Tue, 04 Apr 2017 12:52:33 +0300 Message-ID: <2169094.E5ep7k9Agc@avalon> References: <1491230558-10804-1-git-send-email-narmstrong@baylibre.com> <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8AEFF6E041 for ; Tue, 4 Apr 2017 09:51:48 +0000 (UTC) In-Reply-To: <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Neil Armstrong Cc: Jose.Abreu@synopsys.com, laurent.pinchart+renesas@ideasonboard.com, linux-doc@vger.kernel.org, kieran.bingham@ideasonboard.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-amlogic@lists.infradead.org, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgTmVpbCwKClRoYW5rIHlvdSBmb3IgdGhlIHBhdGNoLgoKT24gTW9uZGF5IDAzIEFwciAyMDE3 IDE2OjQyOjM4IE5laWwgQXJtc3Ryb25nIHdyb3RlOgo+IFRoZSBIRE1JIFRYIGNvbnRyb2xsZXIg c3VwcG9ydCBIUEQgYW5kIFJYU0VOU0Ugc2lnbmFsaW5nIGZyb20gdGhlIFBIWQo+IHZpYSBpdCdz IFNUQVQwIFBIWSBpbnRlcmZhY2UsIGJ1dCBzb21lIHZlbmRvciBQSFlzIGNhbiBtYW5hZ2UgdGhl c2UKPiBzaWduYWxzIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgY29udHJvbGxlciwgdGh1cyB0aGVz ZSBTVEFUMCBoYW5kbGluZwo+IHNob3VsZCBiZSBtb3ZlZCB0byBQSFkgc3BlY2lmaWMgb3BlcmF0 aW9ucyBhbmQgYmVjb21lIG9wdGlvbmFsLgo+IAo+IFRoZSBleGlzdGluZyBTVEFUMCBIUEQgYW5k IFJYU0VOU0UgaGFuZGxpbmcgY29kZSBpcyByZWZhY3RvcmVkIGludG8KPiBhIHN1cHBsZW1lbnRh dHkgc2V0IG9mIGRlZmF1bHQgUEhZIG9wZXJhdGlvbnMgdGhhdCBhcmUgdXNlZCBhdXRvbWF0aWNh bGx5Cj4gd2hlbiB0aGUgcGxhdGZvcm0gZ2x1ZSBkb2Vzbid0IHByb3ZpZGUgaXRzIG93biBvcGVy YXRpb25zLgo+IAo+IFJldmlld2VkLWJ5OiBKb3NlIEFicmV1IDxqb2FicmV1QHN5bm9wc3lzLmNv bT4KPiBSZXZpZXdlZC1ieTogQXJjaGl0IFRhbmVqYSA8YXJjaGl0dEBjb2RlYXVyb3JhLm9yZz4K PiBTaWduZWQtb2ZmLWJ5OiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+ CgpSZXZpZXdlZC1ieTogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5waW5jaGFydEBpZGVhc29u Ym9hcmQuY29tPgoKPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9zeW5vcHN5cy9kdy1o ZG1pLmMgfCAxMzUgKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tCj4gIGluY2x1ZGUvZHJtL2Jy aWRnZS9kd19oZG1pLmggICAgICAgICAgICAgIHwgICA1ICsrCj4gIDIgZmlsZXMgY2hhbmdlZCwg ODYgaW5zZXJ0aW9ucygrKSwgNTQgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMvZHctaGRtaS5jCj4gYi9kcml2ZXJzL2dwdS9kcm0v YnJpZGdlL3N5bm9wc3lzL2R3LWhkbWkuYyBpbmRleCAxNmQ1ZmZmMy4uODRjYzk0OSAxMDA2NDQK PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhkbWkuYwo+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMvZHctaGRtaS5jCj4gQEAgLTEyMjksMTAg KzEyMjksNDYgQEAgc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKPiBkd19oZG1pX3Bo eV9yZWFkX2hwZChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgY29ubmVjdG9yX3N0YXR1c19jb25uZWN0 ZWQgOgo+IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwo+ICB9Cj4gCj4gK3N0YXRpYyB2 b2lkIGR3X2hkbWlfcGh5X3VwZGF0ZV9ocGQoc3RydWN0IGR3X2hkbWkgKmhkbWksIHZvaWQgKmRh dGEsCj4gKwkJCQkgICBib29sIGZvcmNlLCBib29sIGRpc2FibGVkLCBib29sIHJ4c2Vuc2UpCj4g K3sKPiArCXU4IG9sZF9tYXNrID0gaGRtaS0+cGh5X21hc2s7Cj4gKwo+ICsJaWYgKGZvcmNlIHx8 IGRpc2FibGVkIHx8ICFyeHNlbnNlKQo+ICsJCWhkbWktPnBoeV9tYXNrIHw9IEhETUlfUEhZX1JY X1NFTlNFOwo+ICsJZWxzZQo+ICsJCWhkbWktPnBoeV9tYXNrICY9IH5IRE1JX1BIWV9SWF9TRU5T RTsKPiArCj4gKwlpZiAob2xkX21hc2sgIT0gaGRtaS0+cGh5X21hc2spCj4gKwkJaGRtaV93cml0 ZWIoaGRtaSwgaGRtaS0+cGh5X21hc2ssIEhETUlfUEhZX01BU0swKTsKPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHdfaGRtaV9waHlfc2V0dXBfaHBkKHN0cnVjdCBkd19oZG1pICpoZG1pLCB2b2lk ICpkYXRhKQo+ICt7Cj4gKwkvKgo+ICsJICogQ29uZmlndXJlIHRoZSBQSFkgUlggU0VOU0UgYW5k IEhQRCBpbnRlcnJ1cHRzIHBvbGFyaXRpZXMgYW5kIGNsZWFyCj4gKwkgKiBhbnkgcGVuZGluZyBp bnRlcnJ1cHQuCj4gKwkgKi8KPiArCWhkbWlfd3JpdGViKGhkbWksIEhETUlfUEhZX0hQRCB8IEhE TUlfUEhZX1JYX1NFTlNFLCBIRE1JX1BIWV9QT0wwKTsKPiArCWhkbWlfd3JpdGViKGhkbWksIEhE TUlfSUhfUEhZX1NUQVQwX0hQRCB8IEhETUlfSUhfUEhZX1NUQVQwX1JYX1NFTlNFLAo+ICsJCSAg ICBIRE1JX0lIX1BIWV9TVEFUMCk7Cj4gKwo+ICsJLyogRW5hYmxlIGNhYmxlIGhvdCBwbHVnIGly cS4gKi8KPiArCWhkbWlfd3JpdGViKGhkbWksIGhkbWktPnBoeV9tYXNrLCBIRE1JX1BIWV9NQVNL MCk7Cj4gKwo+ICsJLyogQ2xlYXIgYW5kIHVubXV0ZSBpbnRlcnJ1cHRzLiAqLwo+ICsJaGRtaV93 cml0ZWIoaGRtaSwgSERNSV9JSF9QSFlfU1RBVDBfSFBEIHwgSERNSV9JSF9QSFlfU1RBVDBfUlhf U0VOU0UsCj4gKwkJICAgIEhETUlfSUhfUEhZX1NUQVQwKTsKPiArCWhkbWlfd3JpdGViKGhkbWks IH4oSERNSV9JSF9QSFlfU1RBVDBfSFBEIHwgCkhETUlfSUhfUEhZX1NUQVQwX1JYX1NFTlNFKSwK PiArCQkgICAgSERNSV9JSF9NVVRFX1BIWV9TVEFUMCk7Cj4gK30KPiArCj4gIHN0YXRpYyBjb25z dCBzdHJ1Y3QgZHdfaGRtaV9waHlfb3BzIGR3X2hkbWlfc3lub3BzeXNfcGh5X29wcyA9IHsKPiAg CS5pbml0ID0gZHdfaGRtaV9waHlfaW5pdCwKPiAgCS5kaXNhYmxlID0gZHdfaGRtaV9waHlfZGlz YWJsZSwKPiAgCS5yZWFkX2hwZCA9IGR3X2hkbWlfcGh5X3JlYWRfaHBkLAo+ICsJLnVwZGF0ZV9o cGQgPSBkd19oZG1pX3BoeV91cGRhdGVfaHBkLAo+ICsJLnNldHVwX2hwZCA9IGR3X2hkbWlfcGh5 X3NldHVwX2hwZCwKPiAgfTsKPiAKPiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gQEAgLTE4MDgsMzUg KzE4NDQsMTAgQEAgc3RhdGljIHZvaWQgZHdfaGRtaV91cGRhdGVfcG93ZXIoc3RydWN0IGR3X2hk bWkKPiAqaGRtaSkgKi8KPiAgc3RhdGljIHZvaWQgZHdfaGRtaV91cGRhdGVfcGh5X21hc2soc3Ry dWN0IGR3X2hkbWkgKmhkbWkpCj4gIHsKPiAtCXU4IG9sZF9tYXNrID0gaGRtaS0+cGh5X21hc2s7 Cj4gLQo+IC0JaWYgKGhkbWktPmZvcmNlIHx8IGhkbWktPmRpc2FibGVkIHx8ICFoZG1pLT5yeHNl bnNlKQo+IC0JCWhkbWktPnBoeV9tYXNrIHw9IEhETUlfUEhZX1JYX1NFTlNFOwo+IC0JZWxzZQo+ IC0JCWhkbWktPnBoeV9tYXNrICY9IH5IRE1JX1BIWV9SWF9TRU5TRTsKPiAtCj4gLQlpZiAob2xk X21hc2sgIT0gaGRtaS0+cGh5X21hc2spCj4gLQkJaGRtaV93cml0ZWIoaGRtaSwgaGRtaS0+cGh5 X21hc2ssIEhETUlfUEhZX01BU0swKTsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgZHdfaGRtaV9w aHlfc2V0dXBfaHBkKHN0cnVjdCBkd19oZG1pICpoZG1pKQo+IC17Cj4gLQkvKgo+IC0JICogQ29u ZmlndXJlIHRoZSBQSFkgUlggU0VOU0UgYW5kIEhQRCBpbnRlcnJ1cHRzIHBvbGFyaXRpZXMgYW5k IGNsZWFyCj4gLQkgKiBhbnkgcGVuZGluZyBpbnRlcnJ1cHQuCj4gLQkgKi8KPiAtCWhkbWlfd3Jp dGViKGhkbWksIEhETUlfUEhZX0hQRCB8IEhETUlfUEhZX1JYX1NFTlNFLCBIRE1JX1BIWV9QT0ww KTsKPiAtCWhkbWlfd3JpdGViKGhkbWksIEhETUlfSUhfUEhZX1NUQVQwX0hQRCB8IEhETUlfSUhf UEhZX1NUQVQwX1JYX1NFTlNFLAo+IC0JCSAgICBIRE1JX0lIX1BIWV9TVEFUMCk7Cj4gLQo+IC0J LyogRW5hYmxlIGNhYmxlIGhvdCBwbHVnIGlycS4gKi8KPiAtCWhkbWlfd3JpdGViKGhkbWksIGhk bWktPnBoeV9tYXNrLCBIRE1JX1BIWV9NQVNLMCk7Cj4gLQo+IC0JLyogQ2xlYXIgYW5kIHVubXV0 ZSBpbnRlcnJ1cHRzLiAqLwo+IC0JaGRtaV93cml0ZWIoaGRtaSwgSERNSV9JSF9QSFlfU1RBVDBf SFBEIHwgSERNSV9JSF9QSFlfU1RBVDBfUlhfU0VOU0UsCj4gLQkJICAgIEhETUlfSUhfUEhZX1NU QVQwKTsKPiAtCWhkbWlfd3JpdGViKGhkbWksIH4oSERNSV9JSF9QSFlfU1RBVDBfSFBEIHwgCkhE TUlfSUhfUEhZX1NUQVQwX1JYX1NFTlNFKSwKPiAtCQkgICAgSERNSV9JSF9NVVRFX1BIWV9TVEFU MCk7Cj4gKwlpZiAoaGRtaS0+cGh5Lm9wcy0+dXBkYXRlX2hwZCkKPiArCQloZG1pLT5waHkub3Bz LT51cGRhdGVfaHBkKGhkbWksIGhkbWktPnBoeS5kYXRhLAo+ICsJCQkJCSAgaGRtaS0+Zm9yY2Us IGhkbWktPmRpc2FibGVkLAo+ICsJCQkJCSAgaGRtaS0+cnhzZW5zZSk7Cj4gIH0KPiAKPiAgc3Rh dGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKPiBAQCAtMjAyOCw2ICsyMDM5LDQxIEBAIHN0 YXRpYyBpcnFyZXR1cm5fdCBkd19oZG1pX2hhcmRpcnEoaW50IGlycSwgdm9pZAo+ICpkZXZfaWQp IHJldHVybiByZXQ7Cj4gIH0KPiAKPiArdm9pZCBfX2R3X2hkbWlfc2V0dXBfcnhfc2Vuc2Uoc3Ry dWN0IGR3X2hkbWkgKmhkbWksIGJvb2wgaHBkLCBib29sCj4gcnhfc2Vuc2UpICt7Cj4gKwltdXRl eF9sb2NrKCZoZG1pLT5tdXRleCk7Cj4gKwo+ICsJaWYgKCFoZG1pLT5mb3JjZSkgewo+ICsJCS8q Cj4gKwkJICogSWYgdGhlIFJYIHNlbnNlIHN0YXR1cyBpbmRpY2F0ZXMgd2UncmUgZGlzY29ubmVj dGVkLAo+ICsJCSAqIGNsZWFyIHRoZSBzb2Z0d2FyZSByeHNlbnNlIHN0YXR1cy4KPiArCQkgKi8K PiArCQlpZiAoIXJ4X3NlbnNlKQo+ICsJCQloZG1pLT5yeHNlbnNlID0gZmFsc2U7Cj4gKwo+ICsJ CS8qCj4gKwkJICogT25seSBzZXQgdGhlIHNvZnR3YXJlIHJ4c2Vuc2Ugc3RhdHVzIHdoZW4gYm90 aAo+ICsJCSAqIHJ4c2Vuc2UgYW5kIGhwZCBpbmRpY2F0ZXMgd2UncmUgY29ubmVjdGVkLgo+ICsJ CSAqIFRoaXMgYXZvaWRzIHdoYXQgc2VlbXMgdG8gYmUgYmFkIGJlaGF2aW91ciBpbgo+ICsJCSAq IGF0IGxlYXN0IGlNWDZTIHZlcnNpb25zIG9mIHRoZSBwaHkuCj4gKwkJICovCj4gKwkJaWYgKGhw ZCkKPiArCQkJaGRtaS0+cnhzZW5zZSA9IHRydWU7Cj4gKwo+ICsJCWR3X2hkbWlfdXBkYXRlX3Bv d2VyKGhkbWkpOwo+ICsJCWR3X2hkbWlfdXBkYXRlX3BoeV9tYXNrKGhkbWkpOwo+ICsJfQo+ICsJ bXV0ZXhfdW5sb2NrKCZoZG1pLT5tdXRleCk7Cj4gK30KPiArCj4gK3ZvaWQgZHdfaGRtaV9zZXR1 cF9yeF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgaHBkLCBib29sIHJ4X3NlbnNlKQo+ ICt7Cj4gKwlzdHJ1Y3QgZHdfaGRtaSAqaGRtaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsK PiArCV9fZHdfaGRtaV9zZXR1cF9yeF9zZW5zZShoZG1pLCBocGQsIHJ4X3NlbnNlKTsKPiArfQo+ ICtFWFBPUlRfU1lNQk9MX0dQTChkd19oZG1pX3NldHVwX3J4X3NlbnNlKTsKPiArCj4gIHN0YXRp YyBpcnFyZXR1cm5fdCBkd19oZG1pX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4gIHsKPiAg CXN0cnVjdCBkd19oZG1pICpoZG1pID0gZGV2X2lkOwo+IEBAIC0yMDYwLDMwICsyMTA2LDEwIEBA IHN0YXRpYyBpcnFyZXR1cm5fdCBkd19oZG1pX2lycShpbnQgaXJxLCB2b2lkCj4gKmRldl9pZCkg KiBhc2sgdGhlIHNvdXJjZSB0byByZS1yZWFkIHRoZSBFRElELgo+ICAJICovCj4gIAlpZiAoaW50 cl9zdGF0ICYKPiAtCSAgICAoSERNSV9JSF9QSFlfU1RBVDBfUlhfU0VOU0UgfCBIRE1JX0lIX1BI WV9TVEFUMF9IUEQpKSB7Cj4gLQkJbXV0ZXhfbG9jaygmaGRtaS0+bXV0ZXgpOwo+IC0JCWlmICgh aGRtaS0+Zm9yY2UpIHsKPiAtCQkJLyoKPiAtCQkJICogSWYgdGhlIFJYIHNlbnNlIHN0YXR1cyBp bmRpY2F0ZXMgd2UncmUgCmRpc2Nvbm5lY3RlZCwKPiAtCQkJICogY2xlYXIgdGhlIHNvZnR3YXJl IHJ4c2Vuc2Ugc3RhdHVzLgo+IC0JCQkgKi8KPiAtCQkJaWYgKCEocGh5X3N0YXQgJiBIRE1JX1BI WV9SWF9TRU5TRSkpCj4gLQkJCQloZG1pLT5yeHNlbnNlID0gZmFsc2U7Cj4gLQo+IC0JCQkvKgo+ IC0JCQkgKiBPbmx5IHNldCB0aGUgc29mdHdhcmUgcnhzZW5zZSBzdGF0dXMgd2hlbiBib3RoCj4g LQkJCSAqIHJ4c2Vuc2UgYW5kIGhwZCBpbmRpY2F0ZXMgd2UncmUgY29ubmVjdGVkLgo+IC0JCQkg KiBUaGlzIGF2b2lkcyB3aGF0IHNlZW1zIHRvIGJlIGJhZCBiZWhhdmlvdXIgaW4KPiAtCQkJICog YXQgbGVhc3QgaU1YNlMgdmVyc2lvbnMgb2YgdGhlIHBoeS4KPiAtCQkJICovCj4gLQkJCWlmIChw aHlfc3RhdCAmIEhETUlfUEhZX0hQRCkKPiAtCQkJCWhkbWktPnJ4c2Vuc2UgPSB0cnVlOwo+IC0K PiAtCQkJZHdfaGRtaV91cGRhdGVfcG93ZXIoaGRtaSk7Cj4gLQkJCWR3X2hkbWlfdXBkYXRlX3Bo eV9tYXNrKGhkbWkpOwo+IC0JCX0KPiAtCQltdXRleF91bmxvY2soJmhkbWktPm11dGV4KTsKPiAt CX0KPiArCSAgICAoSERNSV9JSF9QSFlfU1RBVDBfUlhfU0VOU0UgfCBIRE1JX0lIX1BIWV9TVEFU MF9IUEQpKQo+ICsJCV9fZHdfaGRtaV9zZXR1cF9yeF9zZW5zZShoZG1pLAo+ICsJCQkJCSBwaHlf c3RhdCAmIEhETUlfUEhZX0hQRCwKPiArCQkJCQkgcGh5X3N0YXQgJiBIRE1JX1BIWV9SWF9TRU5T RSk7Cj4gCj4gIAlpZiAoaW50cl9zdGF0ICYgSERNSV9JSF9QSFlfU1RBVDBfSFBEKSB7Cj4gIAkJ ZGV2X2RiZyhoZG1pLT5kZXYsICJFVkVOVD0lc1xuIiwKPiBAQCAtMjM1Nyw3ICsyMzgzLDggQEAg c3RhdGljIGludCBkd19oZG1pX2RldGVjdF9waHkoc3RydWN0IGR3X2hkbWkgKmhkbWkpCj4gICNl bmRpZgo+IAo+ICAJZHdfaGRtaV9zZXR1cF9pMmMoaGRtaSk7Cj4gLQlkd19oZG1pX3BoeV9zZXR1 cF9ocGQoaGRtaSk7Cj4gKwlpZiAoaGRtaS0+cGh5Lm9wcy0+c2V0dXBfaHBkKQo+ICsJCWhkbWkt PnBoeS5vcHMtPnNldHVwX2hwZChoZG1pLCBoZG1pLT5waHkuZGF0YSk7Cj4gCj4gIAltZW1zZXQo JnBkZXZpbmZvLCAwLCBzaXplb2YocGRldmluZm8pKTsKPiAgCXBkZXZpbmZvLnBhcmVudCA9IGRl djsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vYnJpZGdlL2R3X2hkbWkuaCBiL2luY2x1ZGUv ZHJtL2JyaWRnZS9kd19oZG1pLmgKPiBpbmRleCA0NWMyYzE1Li5lNjNkNjc1IDEwMDY0NAo+IC0t LSBhL2luY2x1ZGUvZHJtL2JyaWRnZS9kd19oZG1pLmgKPiArKysgYi9pbmNsdWRlL2RybS9icmlk Z2UvZHdfaGRtaS5oCj4gQEAgLTExNyw2ICsxMTcsOSBAQCBzdHJ1Y3QgZHdfaGRtaV9waHlfb3Bz IHsKPiAgCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpOwo+ICAJdm9pZCAoKmRp c2FibGUpKHN0cnVjdCBkd19oZG1pICpoZG1pLCB2b2lkICpkYXRhKTsKPiAgCWVudW0gZHJtX2Nv bm5lY3Rvcl9zdGF0dXMgKCpyZWFkX2hwZCkoc3RydWN0IGR3X2hkbWkgKmhkbWksIHZvaWQgCipk YXRhKTsKPiArCXZvaWQgKCp1cGRhdGVfaHBkKShzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgdm9pZCAq ZGF0YSwKPiArCQkJICAgYm9vbCBmb3JjZSwgYm9vbCBkaXNhYmxlZCwgYm9vbCByeHNlbnNlKTsK PiArCXZvaWQgKCpzZXR1cF9ocGQpKHN0cnVjdCBkd19oZG1pICpoZG1pLCB2b2lkICpkYXRhKTsK PiAgfTsKPiAKPiAgc3RydWN0IGR3X2hkbWlfcGxhdF9kYXRhIHsKPiBAQCAtMTQ3LDYgKzE1MCw4 IEBAIGludCBkd19oZG1pX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCj4gIGlu dCBkd19oZG1pX2JpbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGRybV9l bmNvZGVyICplbmNvZGVyLAo+IGNvbnN0IHN0cnVjdCBkd19oZG1pX3BsYXRfZGF0YSAqcGxhdF9k YXRhKTsKPiAKPiArdm9pZCBkd19oZG1pX3NldHVwX3J4X3NlbnNlKHN0cnVjdCBkZXZpY2UgKmRl diwgYm9vbCBocGQsIGJvb2wgcnhfc2Vuc2UpOwo+ICsKPiAgdm9pZCBkd19oZG1pX3NldF9zYW1w bGVfcmF0ZShzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgdW5zaWduZWQgaW50IHJhdGUpOwo+ICB2b2lk IGR3X2hkbWlfYXVkaW9fZW5hYmxlKHN0cnVjdCBkd19oZG1pICpoZG1pKTsKPiAgdm9pZCBkd19o ZG1pX2F1ZGlvX2Rpc2FibGUoc3RydWN0IGR3X2hkbWkgKmhkbWkpOwoKLS0gClJlZ2FyZHMsCgpM YXVyZW50IFBpbmNoYXJ0CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3Rv cC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmkt ZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from galahad.ideasonboard.com ([185.26.127.97]:39357 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753122AbdDDJvt (ORCPT ); Tue, 4 Apr 2017 05:51:49 -0400 From: Laurent Pinchart To: Neil Armstrong Cc: dri-devel@lists.freedesktop.org, laurent.pinchart+renesas@ideasonboard.com, architt@codeaurora.org, Jose.Abreu@synopsys.com, kieran.bingham@ideasonboard.com, linux-amlogic@lists.infradead.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-media@vger.kernel.org Subject: Re: [PATCH v6 6/6] drm: bridge: dw-hdmi: Move HPD handling to PHY operations Date: Tue, 04 Apr 2017 12:52:33 +0300 Message-ID: <2169094.E5ep7k9Agc@avalon> In-Reply-To: <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> References: <1491230558-10804-1-git-send-email-narmstrong@baylibre.com> <1491230558-10804-7-git-send-email-narmstrong@baylibre.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-media-owner@vger.kernel.org List-ID: Hi Neil, Thank you for the patch. On Monday 03 Apr 2017 16:42:38 Neil Armstrong wrote: > The HDMI TX controller support HPD and RXSENSE signaling from the PHY > via it's STAT0 PHY interface, but some vendor PHYs can manage these > signals independently from the controller, thus these STAT0 handling > should be moved to PHY specific operations and become optional. > > The existing STAT0 HPD and RXSENSE handling code is refactored into > a supplementaty set of default PHY operations that are used automatically > when the platform glue doesn't provide its own operations. > > Reviewed-by: Jose Abreu > Reviewed-by: Archit Taneja > Signed-off-by: Neil Armstrong Reviewed-by: Laurent Pinchart > --- > drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 135 +++++++++++++++------------ > include/drm/bridge/dw_hdmi.h | 5 ++ > 2 files changed, 86 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 16d5fff3..84cc949 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c > @@ -1229,10 +1229,46 @@ static enum drm_connector_status > dw_hdmi_phy_read_hpd(struct dw_hdmi *hdmi, connector_status_connected : > connector_status_disconnected; > } > > +static void dw_hdmi_phy_update_hpd(struct dw_hdmi *hdmi, void *data, > + bool force, bool disabled, bool rxsense) > +{ > + u8 old_mask = hdmi->phy_mask; > + > + if (force || disabled || !rxsense) > + hdmi->phy_mask |= HDMI_PHY_RX_SENSE; > + else > + hdmi->phy_mask &= ~HDMI_PHY_RX_SENSE; > + > + if (old_mask != hdmi->phy_mask) > + hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > +} > + > +static void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi, void *data) > +{ > + /* > + * Configure the PHY RX SENSE and HPD interrupts polarities and clear > + * any pending interrupt. > + */ > + hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0); > + hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > + HDMI_IH_PHY_STAT0); > + > + /* Enable cable hot plug irq. */ > + hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > + > + /* Clear and unmute interrupts. */ > + hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > + HDMI_IH_PHY_STAT0); > + hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE), > + HDMI_IH_MUTE_PHY_STAT0); > +} > + > static const struct dw_hdmi_phy_ops dw_hdmi_synopsys_phy_ops = { > .init = dw_hdmi_phy_init, > .disable = dw_hdmi_phy_disable, > .read_hpd = dw_hdmi_phy_read_hpd, > + .update_hpd = dw_hdmi_phy_update_hpd, > + .setup_hpd = dw_hdmi_phy_setup_hpd, > }; > > /* ------------------------------------------------------------------------ > @@ -1808,35 +1844,10 @@ static void dw_hdmi_update_power(struct dw_hdmi > *hdmi) */ > static void dw_hdmi_update_phy_mask(struct dw_hdmi *hdmi) > { > - u8 old_mask = hdmi->phy_mask; > - > - if (hdmi->force || hdmi->disabled || !hdmi->rxsense) > - hdmi->phy_mask |= HDMI_PHY_RX_SENSE; > - else > - hdmi->phy_mask &= ~HDMI_PHY_RX_SENSE; > - > - if (old_mask != hdmi->phy_mask) > - hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > -} > - > -static void dw_hdmi_phy_setup_hpd(struct dw_hdmi *hdmi) > -{ > - /* > - * Configure the PHY RX SENSE and HPD interrupts polarities and clear > - * any pending interrupt. > - */ > - hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0); > - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > - HDMI_IH_PHY_STAT0); > - > - /* Enable cable hot plug irq. */ > - hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); > - > - /* Clear and unmute interrupts. */ > - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, > - HDMI_IH_PHY_STAT0); > - hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE), > - HDMI_IH_MUTE_PHY_STAT0); > + if (hdmi->phy.ops->update_hpd) > + hdmi->phy.ops->update_hpd(hdmi, hdmi->phy.data, > + hdmi->force, hdmi->disabled, > + hdmi->rxsense); > } > > static enum drm_connector_status > @@ -2028,6 +2039,41 @@ static irqreturn_t dw_hdmi_hardirq(int irq, void > *dev_id) return ret; > } > > +void __dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool > rx_sense) +{ > + mutex_lock(&hdmi->mutex); > + > + if (!hdmi->force) { > + /* > + * If the RX sense status indicates we're disconnected, > + * clear the software rxsense status. > + */ > + if (!rx_sense) > + hdmi->rxsense = false; > + > + /* > + * Only set the software rxsense status when both > + * rxsense and hpd indicates we're connected. > + * This avoids what seems to be bad behaviour in > + * at least iMX6S versions of the phy. > + */ > + if (hpd) > + hdmi->rxsense = true; > + > + dw_hdmi_update_power(hdmi); > + dw_hdmi_update_phy_mask(hdmi); > + } > + mutex_unlock(&hdmi->mutex); > +} > + > +void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense) > +{ > + struct dw_hdmi *hdmi = dev_get_drvdata(dev); > + > + __dw_hdmi_setup_rx_sense(hdmi, hpd, rx_sense); > +} > +EXPORT_SYMBOL_GPL(dw_hdmi_setup_rx_sense); > + > static irqreturn_t dw_hdmi_irq(int irq, void *dev_id) > { > struct dw_hdmi *hdmi = dev_id; > @@ -2060,30 +2106,10 @@ static irqreturn_t dw_hdmi_irq(int irq, void > *dev_id) * ask the source to re-read the EDID. > */ > if (intr_stat & > - (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) { > - mutex_lock(&hdmi->mutex); > - if (!hdmi->force) { > - /* > - * If the RX sense status indicates we're disconnected, > - * clear the software rxsense status. > - */ > - if (!(phy_stat & HDMI_PHY_RX_SENSE)) > - hdmi->rxsense = false; > - > - /* > - * Only set the software rxsense status when both > - * rxsense and hpd indicates we're connected. > - * This avoids what seems to be bad behaviour in > - * at least iMX6S versions of the phy. > - */ > - if (phy_stat & HDMI_PHY_HPD) > - hdmi->rxsense = true; > - > - dw_hdmi_update_power(hdmi); > - dw_hdmi_update_phy_mask(hdmi); > - } > - mutex_unlock(&hdmi->mutex); > - } > + (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) > + __dw_hdmi_setup_rx_sense(hdmi, > + phy_stat & HDMI_PHY_HPD, > + phy_stat & HDMI_PHY_RX_SENSE); > > if (intr_stat & HDMI_IH_PHY_STAT0_HPD) { > dev_dbg(hdmi->dev, "EVENT=%s\n", > @@ -2357,7 +2383,8 @@ static int dw_hdmi_detect_phy(struct dw_hdmi *hdmi) > #endif > > dw_hdmi_setup_i2c(hdmi); > - dw_hdmi_phy_setup_hpd(hdmi); > + if (hdmi->phy.ops->setup_hpd) > + hdmi->phy.ops->setup_hpd(hdmi, hdmi->phy.data); > > memset(&pdevinfo, 0, sizeof(pdevinfo)); > pdevinfo.parent = dev; > diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h > index 45c2c15..e63d675 100644 > --- a/include/drm/bridge/dw_hdmi.h > +++ b/include/drm/bridge/dw_hdmi.h > @@ -117,6 +117,9 @@ struct dw_hdmi_phy_ops { > struct drm_display_mode *mode); > void (*disable)(struct dw_hdmi *hdmi, void *data); > enum drm_connector_status (*read_hpd)(struct dw_hdmi *hdmi, void *data); > + void (*update_hpd)(struct dw_hdmi *hdmi, void *data, > + bool force, bool disabled, bool rxsense); > + void (*setup_hpd)(struct dw_hdmi *hdmi, void *data); > }; > > struct dw_hdmi_plat_data { > @@ -147,6 +150,8 @@ int dw_hdmi_probe(struct platform_device *pdev, > int dw_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, > const struct dw_hdmi_plat_data *plat_data); > > +void dw_hdmi_setup_rx_sense(struct device *dev, bool hpd, bool rx_sense); > + > void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate); > void dw_hdmi_audio_enable(struct dw_hdmi *hdmi); > void dw_hdmi_audio_disable(struct dw_hdmi *hdmi); -- Regards, Laurent Pinchart