Implement .enable_hpd() and .disable_hpd() phy ops for RK3576 and RK3588
SoCs, used by the corresponding bridge callbacks for HPD activation
control.

Consolidate the interrupt clear-and-unmask sequence into enable_hpd()
and the mask-only operation into disable_hpd(), replacing the open-coded
register writes in the interrupt handlers and io_init().

The .setup_hpd() phy op, which was previously called from
dw_hdmi_qp_init_hw(), is no longer needed and its users are removed.

Signed-off-by: Cristian Ciocaltea <[email protected]>
---
 drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c | 78 +++++++++++++-------------
 1 file changed, 38 insertions(+), 40 deletions(-)

diff --git a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c 
b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
index 11ca73ca4caf..c8675f43c687 100644
--- a/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c
@@ -274,7 +274,7 @@ dw_hdmi_qp_rk3588_read_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
        return val ? connector_status_connected : connector_status_disconnected;
 }
 
-static void dw_hdmi_qp_rk3588_setup_hpd(struct dw_hdmi_qp *dw_hdmi, void *data)
+static void dw_hdmi_qp_rk3588_enable_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
 {
        struct rockchip_hdmi_qp *hdmi = (struct rockchip_hdmi_qp *)data;
        u32 val;
@@ -289,11 +289,25 @@ static void dw_hdmi_qp_rk3588_setup_hpd(struct dw_hdmi_qp 
*dw_hdmi, void *data)
        regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
 }
 
+static void dw_hdmi_qp_rk3588_disable_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
+{
+       struct rockchip_hdmi_qp *hdmi = (struct rockchip_hdmi_qp *)data;
+       u32 val;
+
+       if (hdmi->port_id)
+               val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1);
+       else
+               val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1);
+
+       regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
+}
+
 static const struct dw_hdmi_qp_phy_ops rk3588_hdmi_phy_ops = {
        .init           = dw_hdmi_qp_rk3588_phy_init,
        .disable        = dw_hdmi_qp_rk3588_phy_disable,
        .read_hpd       = dw_hdmi_qp_rk3588_read_hpd,
-       .setup_hpd      = dw_hdmi_qp_rk3588_setup_hpd,
+       .enable_hpd     = dw_hdmi_qp_rk3588_enable_hpd,
+       .disable_hpd    = dw_hdmi_qp_rk3588_disable_hpd,
 };
 
 static enum drm_connector_status
@@ -308,7 +322,7 @@ dw_hdmi_qp_rk3576_read_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
                connector_status_connected : connector_status_disconnected;
 }
 
-static void dw_hdmi_qp_rk3576_setup_hpd(struct dw_hdmi_qp *dw_hdmi, void *data)
+static void dw_hdmi_qp_rk3576_enable_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
 {
        struct rockchip_hdmi_qp *hdmi = (struct rockchip_hdmi_qp *)data;
        u32 val;
@@ -317,14 +331,22 @@ static void dw_hdmi_qp_rk3576_setup_hpd(struct dw_hdmi_qp 
*dw_hdmi, void *data)
               FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0));
 
        regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val);
-       regmap_write(hdmi->regmap, 0xa404, 0xffff0102);
+}
+
+static void dw_hdmi_qp_rk3576_disable_hpd(struct dw_hdmi_qp *dw_hdmi, void 
*data)
+{
+       struct rockchip_hdmi_qp *hdmi = (struct rockchip_hdmi_qp *)data;
+
+       regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0,
+                    FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1));
 }
 
 static const struct dw_hdmi_qp_phy_ops rk3576_hdmi_phy_ops = {
        .init           = dw_hdmi_qp_rk3588_phy_init,
        .disable        = dw_hdmi_qp_rk3588_phy_disable,
        .read_hpd       = dw_hdmi_qp_rk3576_read_hpd,
-       .setup_hpd      = dw_hdmi_qp_rk3576_setup_hpd,
+       .enable_hpd     = dw_hdmi_qp_rk3576_enable_hpd,
+       .disable_hpd    = dw_hdmi_qp_rk3576_disable_hpd,
 };
 
 static void dw_hdmi_qp_rk3588_hpd_work(struct work_struct *work)
@@ -345,13 +367,12 @@ static void dw_hdmi_qp_rk3588_hpd_work(struct work_struct 
*work)
 static irqreturn_t dw_hdmi_qp_rk3576_hardirq(int irq, void *dev_id)
 {
        struct rockchip_hdmi_qp *hdmi = dev_id;
-       u32 intr_stat, val;
+       u32 intr_stat;
 
        regmap_read(hdmi->regmap, RK3576_IOC_HDMI_HPD_STATUS, &intr_stat);
-       if (intr_stat) {
-               val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1);
 
-               regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val);
+       if (intr_stat) {
+               dw_hdmi_qp_rk3576_disable_hpd(NULL, hdmi);
                return IRQ_WAKE_THREAD;
        }
 
@@ -361,15 +382,11 @@ static irqreturn_t dw_hdmi_qp_rk3576_hardirq(int irq, 
void *dev_id)
 static irqreturn_t dw_hdmi_qp_rk3576_irq(int irq, void *dev_id)
 {
        struct rockchip_hdmi_qp *hdmi = dev_id;
-       u32 val;
 
-       val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_CLR, 1);
-       regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val);
        mod_delayed_work(system_percpu_wq, &hdmi->hpd_work,
                         msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
 
-       val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 0);
-       regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val);
+       dw_hdmi_qp_rk3576_enable_hpd(NULL, hdmi);
 
        return IRQ_HANDLED;
 }
@@ -377,16 +394,12 @@ static irqreturn_t dw_hdmi_qp_rk3576_irq(int irq, void 
*dev_id)
 static irqreturn_t dw_hdmi_qp_rk3588_hardirq(int irq, void *dev_id)
 {
        struct rockchip_hdmi_qp *hdmi = dev_id;
-       u32 intr_stat, val;
+       u32 intr_stat;
 
        regmap_read(hdmi->regmap, RK3588_GRF_SOC_STATUS1, &intr_stat);
 
        if (intr_stat) {
-               if (hdmi->port_id)
-                       val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1);
-               else
-                       val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1);
-               regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
+               dw_hdmi_qp_rk3588_disable_hpd(NULL, hdmi);
                return IRQ_WAKE_THREAD;
        }
 
@@ -396,22 +409,11 @@ static irqreturn_t dw_hdmi_qp_rk3588_hardirq(int irq, 
void *dev_id)
 static irqreturn_t dw_hdmi_qp_rk3588_irq(int irq, void *dev_id)
 {
        struct rockchip_hdmi_qp *hdmi = dev_id;
-       u32 val;
-
-       if (hdmi->port_id)
-               val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_CLR, 1);
-       else
-               val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_CLR, 1);
-       regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
 
        mod_delayed_work(system_percpu_wq, &hdmi->hpd_work,
                         msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
 
-       if (hdmi->port_id)
-               val |= FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 0);
-       else
-               val |= FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 0);
-       regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
+       dw_hdmi_qp_rk3588_enable_hpd(NULL, hdmi);
 
        return IRQ_HANDLED;
 }
@@ -424,11 +426,11 @@ static void dw_hdmi_qp_rk3576_io_init(struct 
rockchip_hdmi_qp *hdmi)
              FIELD_PREP_WM16(RK3576_SDAIN_MASK, 1) |
              FIELD_PREP_WM16(RK3576_HDMI_GRANT_SEL, 1) |
              FIELD_PREP_WM16(RK3576_I2S_SEL_MASK, 1);
-
        regmap_write(hdmi->vo_regmap, RK3576_VO0_GRF_SOC_CON14, val);
 
-       val = FIELD_PREP_WM16(RK3576_HDMI_HPD_INT_MSK, 1);
-       regmap_write(hdmi->regmap, RK3576_IOC_MISC_CON0, val);
+       regmap_write(hdmi->regmap, 0xa404, 0xffff0102);
+
+       dw_hdmi_qp_rk3576_disable_hpd(NULL, hdmi);
 }
 
 static void dw_hdmi_qp_rk3588_io_init(struct rockchip_hdmi_qp *hdmi)
@@ -453,11 +455,7 @@ static void dw_hdmi_qp_rk3588_io_init(struct 
rockchip_hdmi_qp *hdmi)
                val = FIELD_PREP_WM16(RK3588_HDMI0_GRANT_SEL, 1);
        regmap_write(hdmi->vo_regmap, RK3588_GRF_VO1_CON9, val);
 
-       if (hdmi->port_id)
-               val = FIELD_PREP_WM16(RK3588_HDMI1_HPD_INT_MSK, 1);
-       else
-               val = FIELD_PREP_WM16(RK3588_HDMI0_HPD_INT_MSK, 1);
-       regmap_write(hdmi->regmap, RK3588_GRF_SOC_CON2, val);
+       dw_hdmi_qp_rk3588_disable_hpd(NULL, hdmi);
 }
 
 static void dw_hdmi_qp_rk3576_enc_init(struct rockchip_hdmi_qp *hdmi,

-- 
2.54.0

Reply via email to