drm/amdgpu: Clear the hotplug interrupt ack bit before hpd initialization
[linux-2.6-microblaze.git] / drivers / gpu / drm / amd / amdgpu / dce_v6_0.c
index 4dbe9b3..60d4020 100644 (file)
@@ -273,6 +273,21 @@ static void dce_v6_0_hpd_set_polarity(struct amdgpu_device *adev,
        WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
 }
 
+static void dce_v6_0_hpd_int_ack(struct amdgpu_device *adev,
+                                int hpd)
+{
+       u32 tmp;
+
+       if (hpd >= adev->mode_info.num_hpd) {
+               DRM_DEBUG("invalid hdp %d\n", hpd);
+               return;
+       }
+
+       tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
+       tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
+       WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+}
+
 /**
  * dce_v6_0_hpd_init - hpd setup callback.
  *
@@ -312,6 +327,7 @@ static void dce_v6_0_hpd_init(struct amdgpu_device *adev)
                        continue;
                }
 
+               dce_v6_0_hpd_int_ack(adev, amdgpu_connector->hpd.hpd);
                dce_v6_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);
                amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);
        }
@@ -3089,7 +3105,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
                            struct amdgpu_irq_src *source,
                            struct amdgpu_iv_entry *entry)
 {
-       uint32_t disp_int, mask, tmp;
+       uint32_t disp_int, mask;
        unsigned hpd;
 
        if (entry->src_data[0] >= adev->mode_info.num_hpd) {
@@ -3102,9 +3118,7 @@ static int dce_v6_0_hpd_irq(struct amdgpu_device *adev,
        mask = interrupt_status_offsets[hpd].hpd;
 
        if (disp_int & mask) {
-               tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]);
-               tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK;
-               WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp);
+               dce_v6_0_hpd_int_ack(adev, hpd);
                schedule_delayed_work(&adev->hotplug_work, 0);
                DRM_DEBUG("IH: HPD%d\n", hpd + 1);
        }