#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),