| From 72d9cb9a6144567d362e748c753cbee6adc20255 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Tue, 4 Apr 2017 14:31:56 +0200 |
| Subject: [PATCH 239/286] drm: bridge: dw-hdmi: Extract PHY interrupt setup to |
| a function |
| |
| In preparation for adding PHY operations to handle RX SENSE and HPD, |
| group all the PHY interrupt setup code in a single location and extract |
| it to a separate function. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Reviewed-by: Jose Abreu <joabreu@synopsys.com> |
| [narmstrong: renamed dw_hdmi_fb_registered to dw_hdmi_setup_i2c] |
| Reviewed-by: Archit Taneja <architt@codeaurora.org> |
| Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> |
| |
| (cherry picked from commit a23d6265f033501529932db2d6b3f4bc138552ab) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 51 +++++++++++++----------------- |
| 1 file changed, 23 insertions(+), 28 deletions(-) |
| |
| --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c |
| @@ -1558,8 +1558,7 @@ static int dw_hdmi_setup(struct dw_hdmi |
| return 0; |
| } |
| |
| -/* Wait until we are registered to enable interrupts */ |
| -static int dw_hdmi_fb_registered(struct dw_hdmi *hdmi) |
| +static void dw_hdmi_setup_i2c(struct dw_hdmi *hdmi) |
| { |
| hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL, |
| HDMI_PHY_I2CM_INT_ADDR); |
| @@ -1567,15 +1566,6 @@ static int dw_hdmi_fb_registered(struct |
| hdmi_writeb(hdmi, HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL | |
| HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL, |
| HDMI_PHY_I2CM_CTLINT_ADDR); |
| - |
| - /* enable cable hot plug irq */ |
| - hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0); |
| - |
| - /* Clear Hotplug interrupts */ |
| - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, |
| - HDMI_IH_PHY_STAT0); |
| - |
| - return 0; |
| } |
| |
| static void initialize_hdmi_ih_mutes(struct dw_hdmi *hdmi) |
| @@ -1693,6 +1683,26 @@ static void dw_hdmi_update_phy_mask(stru |
| 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); |
| +} |
| + |
| static enum drm_connector_status |
| dw_hdmi_connector_detect(struct drm_connector *connector, bool force) |
| { |
| @@ -2204,29 +2214,14 @@ __dw_hdmi_probe(struct platform_device * |
| hdmi->ddc = NULL; |
| } |
| |
| - /* |
| - * Configure registers related to HDMI interrupt |
| - * generation before registering IRQ. |
| - */ |
| - hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0); |
| - |
| - /* Clear Hotplug interrupts */ |
| - hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE, |
| - HDMI_IH_PHY_STAT0); |
| - |
| hdmi->bridge.driver_private = hdmi; |
| hdmi->bridge.funcs = &dw_hdmi_bridge_funcs; |
| #ifdef CONFIG_OF |
| hdmi->bridge.of_node = pdev->dev.of_node; |
| #endif |
| |
| - ret = dw_hdmi_fb_registered(hdmi); |
| - if (ret) |
| - goto err_iahb; |
| - |
| - /* Unmute interrupts */ |
| - hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE), |
| - HDMI_IH_MUTE_PHY_STAT0); |
| + dw_hdmi_setup_i2c(hdmi); |
| + dw_hdmi_phy_setup_hpd(hdmi); |
| |
| memset(&pdevinfo, 0, sizeof(pdevinfo)); |
| pdevinfo.parent = dev; |