}
caps->mode_count = count;
- caps->modes = calloc(1, sizeof(tdm_output_mode) * caps->mode_count);
- if (!caps->modes) {
- ret = TDM_ERROR_OUT_OF_MEMORY;
- TDM_ERR("alloc failed\n");
- goto failed_get;
- }
+ if (caps->mode_count != 0) {
+ caps->modes = calloc(1, sizeof(tdm_output_mode) * caps->mode_count);
+ if (!caps->modes) {
+ ret = TDM_ERROR_OUT_OF_MEMORY;
+ TDM_ERR("alloc failed\n");
+ goto failed_get;
+ }
- output_data->count_drm_modes = connector->count_modes;
- output_data->count_modes = caps->mode_count;
+ output_data->count_drm_modes = connector->count_modes;
+ output_data->count_modes = caps->mode_count;
- if (caps->mode_count != output_data->count_modes) {
drmModeModeInfoPtr new_drm_modes;
tdm_output_mode *new_output_modes;
free(new_drm_modes);
goto failed_get;
}
- free(output_data->vc4_modes);
- free(output_data->output_modes);
+ if (output_data->vc4_modes)
+ free(output_data->vc4_modes);
+ if (output_data->output_modes)
+ free(output_data->output_modes);
output_data->vc4_modes = new_drm_modes;
output_data->output_modes = new_output_modes;
- }
- count = 0;
- for (i = 0; i < connector->count_modes; i++) {
- output_data->vc4_modes[i] = connector->modes[i];
+ count = 0;
+ for (i = 0; i < connector->count_modes; i++) {
+ output_data->vc4_modes[i] = connector->modes[i];
- if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
- (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
- continue;
- if (connector->modes[i].vrefresh > MODE_REFRESH_LIMIT)
- continue;
+ if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) ||
+ (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT))
+ continue;
+ if (connector->modes[i].vrefresh > MODE_REFRESH_LIMIT)
+ continue;
- _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[i],
- &output_data->output_modes[count]);
- caps->modes[count] = output_data->output_modes[count];
- count++;
+ _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[i],
+ &output_data->output_modes[count]);
+ caps->modes[count] = output_data->output_modes[count];
+ count++;
+ }
+ } else {
+ caps->modes = NULL;
+ output_data->count_drm_modes = connector->count_modes;
+ output_data->count_modes = caps->mode_count;
+
+ if (output_data->vc4_modes)
+ free(output_data->vc4_modes);
+ if (output_data->output_modes)
+ free(output_data->output_modes);
+
+ output_data->vc4_modes = NULL;
+ output_data->output_modes = NULL;
}
caps->mmWidth = connector->mmWidth;