+ if (private_output->caps.status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+ private_output->current_mode = NULL;
+
+ /* get the tdm_hwc object */
+ if (private_output->caps.capabilities&TDM_OUTPUT_CAPABILITY_HWC) {
+ hwc = func_output->output_get_hwc(output_backend, &ret);
+ TDM_RETURN_VAL_IF_FAIL(hwc != NULL, ret);
+
+ private_hwc = calloc(1, sizeof(tdm_private_hwc));
+ TDM_RETURN_VAL_IF_FAIL(private_hwc != NULL, TDM_ERROR_OUT_OF_MEMORY);
+
+ private_hwc->private_module = private_module;
+ private_hwc->private_output = private_output;
+ private_hwc->hwc_backend = hwc;
+ private_hwc->index = pipe;
+ private_hwc->stamp = tdm_helper_get_time();
+ while (tdm_display_find_hwc_stamp(private_module->private_display, private_hwc->stamp))
+ private_hwc->stamp++;
+
+ LIST_INITHEAD(&private_hwc->hwc_window_list);
+ LIST_INITHEAD(&private_hwc->hwc_commit_handler_list);
+
+ private_output->private_hwc = private_hwc;
+ } else {
+ LIST_INITHEAD(&private_output->layer_list);
+ LIST_INITHEAD(&private_output->layer_commit_handler_list);
+ }
+ } else {
+ /* need_new_caps will be true only in case of "disconnected -> connected" and "connected -> disconnected"
+ * because we have to get new modes.
+ */
+ if (need_new_caps) {
+ _tdm_display_destroy_caps_output(&private_output->caps);
+
+ ret = _tdm_display_update_caps_output(private_module, pipe, output_backend, &private_output->caps);
+ TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
+
+ if (private_output->caps.status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+ private_output->current_mode = NULL;
+ }