#include <drm/drm_edid.h>
 #include <drm/drm_panel.h>
 
+/* T3 VCC to HPD high is max 200 ms */
+#define HPD_MAX_MS     200
+#define HPD_MAX_US     (HPD_MAX_MS * 1000)
+
 struct atana33xc20_panel {
        struct drm_panel base;
        bool prepared;
 
        struct regulator *supply;
        struct gpio_desc *el_on3_gpio;
+       struct drm_dp_aux *aux;
 
        struct edid *edid;
 
 static int atana33xc20_resume(struct device *dev)
 {
        struct atana33xc20_panel *p = dev_get_drvdata(dev);
-       bool hpd_asserted = false;
+       int hpd_asserted;
        int ret;
 
        /* T12 (Power off time) is min 500 ms */
                return ret;
        p->powered_on_time = ktime_get();
 
-       /*
-        * Handle HPD. Note: if HPD is hooked up to a dedicated pin on the
-        * eDP controller then "no_hpd" will be false _and_ "hpd_gpio" will be
-        * NULL. It's up to the controller driver to wait for HPD after
-        * preparing the panel in that case.
-        */
        if (p->no_hpd) {
-               /* T3 VCC to HPD high is max 200 ms */
-               msleep(200);
-       } else if (p->hpd_gpio) {
+               msleep(HPD_MAX_MS);
+               return 0;
+       }
+
+       if (p->hpd_gpio) {
                ret = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio,
                                         hpd_asserted, hpd_asserted,
-                                        1000, 200000);
-               if (!hpd_asserted)
-                       dev_warn(dev, "Timeout waiting for HPD\n");
+                                        1000, HPD_MAX_US);
+               if (hpd_asserted < 0)
+                       ret = hpd_asserted;
+
+               if (ret)
+                       dev_warn(dev, "Error waiting for HPD GPIO: %d\n", ret);
+
+               return ret;
        }
 
+       if (p->aux->wait_hpd_asserted) {
+               ret = p->aux->wait_hpd_asserted(p->aux, HPD_MAX_US);
+
+               if (ret)
+                       dev_warn(dev, "Controller error waiting for HPD: %d\n", ret);
+
+               return ret;
+       }
+
+       /*
+        * Note that it's possible that no_hpd is false, hpd_gpio is
+        * NULL, and wait_hpd_asserted is NULL. This is because
+        * wait_hpd_asserted() is optional even if HPD is hooked up to
+        * a dedicated pin on the eDP controller. In this case we just
+        * assume that the controller driver will wait for HPD at the
+        * right times.
+        */
        return 0;
 }
 
                return -ENOMEM;
        dev_set_drvdata(dev, panel);
 
+       panel->aux = aux_ep->aux;
+
        panel->supply = devm_regulator_get(dev, "power");
        if (IS_ERR(panel->supply))
                return dev_err_probe(dev, PTR_ERR(panel->supply),