|
@@ -860,3 +860,35 @@ void drm_dp_aux_unregister(struct drm_dp_aux *aux)
|
|
|
i2c_del_adapter(&aux->ddc);
|
|
|
}
|
|
|
EXPORT_SYMBOL(drm_dp_aux_unregister);
|
|
|
+
|
|
|
+#define PSR_SETUP_TIME(x) [DP_PSR_SETUP_TIME_ ## x >> DP_PSR_SETUP_TIME_SHIFT] = (x)
|
|
|
+
|
|
|
+/**
|
|
|
+ * drm_dp_psr_setup_time() - PSR setup in time usec
|
|
|
+ * @psr_cap: PSR capabilities from DPCD
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * PSR setup time for the panel in microseconds, negative
|
|
|
+ * error code on failure.
|
|
|
+ */
|
|
|
+int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE])
|
|
|
+{
|
|
|
+ static const u16 psr_setup_time_us[] = {
|
|
|
+ PSR_SETUP_TIME(330),
|
|
|
+ PSR_SETUP_TIME(275),
|
|
|
+ PSR_SETUP_TIME(165),
|
|
|
+ PSR_SETUP_TIME(110),
|
|
|
+ PSR_SETUP_TIME(55),
|
|
|
+ PSR_SETUP_TIME(0),
|
|
|
+ };
|
|
|
+ int i;
|
|
|
+
|
|
|
+ i = (psr_cap[1] & DP_PSR_SETUP_TIME_MASK) >> DP_PSR_SETUP_TIME_SHIFT;
|
|
|
+ if (i >= ARRAY_SIZE(psr_setup_time_us))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ return psr_setup_time_us[i];
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(drm_dp_psr_setup_time);
|
|
|
+
|
|
|
+#undef PSR_SETUP_TIME
|