/* *Note3(Exampleofpoweroffsequenceindetail)inspec *specifiestowait150msafterdeassertingEL3_ONbefore *poweringoff.
*/ if (p->el3_was_on)
atana33xc20_wait(p->el_on3_off_time, 150);
drm_dp_dpcd_set_powered(p->aux, false);
ret = regulator_disable(p->supply); if (ret) return ret;
p->powered_off_time = ktime_get_boottime();
p->el3_was_on = false;
return0;
}
staticint atana33xc20_resume(struct device *dev)
{ struct atana33xc20_panel *p = dev_get_drvdata(dev); int hpd_asserted; int ret;
/* T12 (Power off time) is min 500 ms */
atana33xc20_wait(p->powered_off_time, 500);
ret = regulator_enable(p->supply); if (ret) return ret;
drm_dp_dpcd_set_powered(p->aux, true);
p->powered_on_time = ktime_get_boottime();
if (p->no_hpd) {
msleep(HPD_MAX_MS); return0;
}
if (p->hpd_gpio) {
ret = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio,
hpd_asserted, hpd_asserted, 1000, HPD_MAX_US); if (hpd_asserted < 0)
ret = hpd_asserted;
if (ret) {
dev_warn(dev, "Error waiting for HPD GPIO: %d\n", ret); goto error;
}
} elseif (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); goto error;
}
}
panel->supply = devm_regulator_get(dev, "power"); if (IS_ERR(panel->supply)) return dev_err_probe(dev, PTR_ERR(panel->supply), "Failed to get power supply\n");
panel->el_on3_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); if (IS_ERR(panel->el_on3_gpio)) return dev_err_probe(dev, PTR_ERR(panel->el_on3_gpio), "Failed to get enable GPIO\n");
panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); if (!panel->no_hpd) {
panel->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); if (IS_ERR(panel->hpd_gpio)) return dev_err_probe(dev, PTR_ERR(panel->hpd_gpio), "Failed to get HPD GPIO\n");
}
pm_runtime_enable(dev);
ret = devm_add_action_or_reset(dev, atana33xc20_runtime_disable, dev); if (ret) return ret;
pm_runtime_set_autosuspend_delay(dev, 2000);
pm_runtime_use_autosuspend(dev);
ret = devm_add_action_or_reset(dev, atana33xc20_dont_use_autosuspend, dev); if (ret) return ret;
pm_runtime_get_sync(dev);
ret = drm_panel_dp_aux_backlight(&panel->base, aux_ep->aux);
pm_runtime_mark_last_busy(dev);
pm_runtime_put_autosuspend(dev);
/* *Warnifwegetanerror,butdon'tconsideritfatal.Having *apanelwherewecan'tcontrolthebacklightisbetterthan *nopanel.
*/ if (ret)
dev_warn(dev, "failed to register dp aux backlight: %d\n", ret);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.