Subversion Repositories Kolibri OS

Rev

Rev 5060 | Rev 6084 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5060 Rev 5271
Line 124... Line 124...
124
	struct drm_fb_helper_connector **temp;
124
	struct drm_fb_helper_connector **temp;
125
	struct drm_fb_helper_connector *fb_helper_connector;
125
	struct drm_fb_helper_connector *fb_helper_connector;
Line 126... Line 126...
126
 
126
 
127
	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
127
	WARN_ON(!mutex_is_locked(&fb_helper->dev->mode_config.mutex));
128
	if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) {
128
	if (fb_helper->connector_count + 1 > fb_helper->connector_info_alloc_count) {
129
		temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector) * (fb_helper->connector_count + 1), GFP_KERNEL);
129
		temp = krealloc(fb_helper->connector_info, sizeof(struct drm_fb_helper_connector *) * (fb_helper->connector_count + 1), GFP_KERNEL);
130
		if (!temp)
130
		if (!temp)
Line 131... Line 131...
131
			return -ENOMEM;
131
			return -ENOMEM;
132
 
132
 
Line 168... Line 168...
168
	fb_helper->connector_count--;
168
	fb_helper->connector_count--;
169
	kfree(fb_helper_connector);
169
	kfree(fb_helper_connector);
170
	return 0;
170
	return 0;
171
}
171
}
172
EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
172
EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
-
 
173
 
173
static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
174
static void drm_fb_helper_save_lut_atomic(struct drm_crtc *crtc, struct drm_fb_helper *helper)
174
{
175
{
175
	uint16_t *r_base, *g_base, *b_base;
176
	uint16_t *r_base, *g_base, *b_base;
176
	int i;
177
	int i;
Line 208... Line 209...
208
	bool error = false;
209
	bool error = false;
209
	int i;
210
	int i;
Line 210... Line 211...
210
 
211
 
Line 211... Line 212...
211
	drm_warn_on_modeset_not_all_locked(dev);
212
	drm_warn_on_modeset_not_all_locked(dev);
212
 
213
 
213
	list_for_each_entry(plane, &dev->mode_config.plane_list, head)
214
	list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
Line -... Line 215...
-
 
215
		if (plane->type != DRM_PLANE_TYPE_PRIMARY)
-
 
216
			drm_plane_force_disable(plane);
-
 
217
 
-
 
218
		if (dev->mode_config.rotation_property) {
-
 
219
			drm_mode_plane_set_obj_prop(plane,
-
 
220
						    dev->mode_config.rotation_property,
-
 
221
						    BIT(DRM_ROTATE_0));
214
		if (plane->type != DRM_PLANE_TYPE_PRIMARY)
222
		}
215
			drm_plane_force_disable(plane);
223
	}
216
 
224
 
217
	for (i = 0; i < fb_helper->crtc_count; i++) {
225
	for (i = 0; i < fb_helper->crtc_count; i++) {
Line 241... Line 249...
241
 */
249
 */
242
bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
250
bool drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
243
{
251
{
244
	struct drm_device *dev = fb_helper->dev;
252
	struct drm_device *dev = fb_helper->dev;
245
	bool ret;
253
	bool ret;
-
 
254
	bool do_delayed = false;
-
 
255
 
246
	drm_modeset_lock_all(dev);
256
	drm_modeset_lock_all(dev);
247
	ret = restore_fbdev_mode(fb_helper);
257
	ret = restore_fbdev_mode(fb_helper);
248
	drm_modeset_unlock_all(dev);
258
	drm_modeset_unlock_all(dev);
249
	return ret;
259
	return ret;
250
}
260
}
Line 704... Line 714...
704
		return -EINVAL;
714
		return -EINVAL;
705
	}
715
	}
Line 706... Line 716...
706
 
716
 
Line 707... Line -...
707
	drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
-
 
708
 
-
 
709
	if (fb_helper->delayed_hotplug) {
-
 
710
		fb_helper->delayed_hotplug = false;
-
 
711
		drm_fb_helper_hotplug_event(fb_helper);
717
	drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper);
712
	}
718
 
713
	return 0;
719
	return 0;
Line 714... Line 720...
714
}
720
}
Line 782... Line 788...
782
	/* first up get a count of crtcs now in use and new min/maxes width/heights */
788
	/* first up get a count of crtcs now in use and new min/maxes width/heights */
783
	for (i = 0; i < fb_helper->connector_count; i++) {
789
	for (i = 0; i < fb_helper->connector_count; i++) {
784
		struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i];
790
		struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i];
785
		struct drm_cmdline_mode *cmdline_mode;
791
		struct drm_cmdline_mode *cmdline_mode;
Line 786... Line 792...
786
 
792
 
Line 787... Line 793...
787
		cmdline_mode = &fb_helper_conn->cmdline_mode;
793
		cmdline_mode = &fb_helper_conn->connector->cmdline_mode;
788
 
794
 
789
		if (cmdline_mode->bpp_specified) {
795
		if (cmdline_mode->bpp_specified) {
790
			switch (cmdline_mode->bpp) {
796
			switch (cmdline_mode->bpp) {
Line 811... Line 817...
811
	}
817
	}
Line 812... Line 818...
812
 
818
 
813
	crtc_count = 0;
819
	crtc_count = 0;
814
	for (i = 0; i < fb_helper->crtc_count; i++) {
820
	for (i = 0; i < fb_helper->crtc_count; i++) {
-
 
821
		struct drm_display_mode *desired_mode;
815
		struct drm_display_mode *desired_mode;
822
		int x, y;
816
		desired_mode = fb_helper->crtc_info[i].desired_mode;
-
 
-
 
823
		desired_mode = fb_helper->crtc_info[i].desired_mode;
-
 
824
		x = fb_helper->crtc_info[i].x;
817
 
825
		y = fb_helper->crtc_info[i].y;
818
		if (desired_mode) {
826
		if (desired_mode) {
819
			if (gamma_size == 0)
827
			if (gamma_size == 0)
820
				gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size;
828
				gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size;
821
			if (desired_mode->hdisplay < sizes.fb_width)
829
			if (desired_mode->hdisplay + x < sizes.fb_width)
822
				sizes.fb_width = desired_mode->hdisplay;
830
				sizes.fb_width = desired_mode->hdisplay + x;
823
			if (desired_mode->vdisplay < sizes.fb_height)
831
			if (desired_mode->vdisplay + y < sizes.fb_height)
824
				sizes.fb_height = desired_mode->vdisplay;
832
				sizes.fb_height = desired_mode->vdisplay + y;
825
			if (desired_mode->hdisplay > sizes.surface_width)
833
			if (desired_mode->hdisplay + x > sizes.surface_width)
826
				sizes.surface_width = desired_mode->hdisplay;
834
				sizes.surface_width = desired_mode->hdisplay + x;
827
			if (desired_mode->vdisplay > sizes.surface_height)
835
			if (desired_mode->vdisplay + y > sizes.surface_height)
828
				sizes.surface_height = desired_mode->vdisplay;
836
				sizes.surface_height = desired_mode->vdisplay + y;
829
			crtc_count++;
837
			crtc_count++;
830
       }
838
       }
Line 831... Line 839...
831
	}
839
	}
Line 856... Line 864...
856
		if (fb_helper->crtc_info[i].mode_set.num_connectors)
864
		if (fb_helper->crtc_info[i].mode_set.num_connectors)
857
		fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
865
		fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
Line 858... Line 866...
858
 
866
 
-
 
867
 
-
 
868
		info->var.pixclock = 0;
Line 859... Line 869...
859
 
869
	dev_info(fb_helper->dev->dev, "fb%d: %s frame buffer device\n",
Line 860... Line 870...
860
		info->var.pixclock = 0;
870
			info->node, info->fix.id);
861
 
871
 
Line 1015... Line 1025...
1015
}
1025
}
1016
EXPORT_SYMBOL(drm_has_preferred_mode);
1026
EXPORT_SYMBOL(drm_has_preferred_mode);
Line 1017... Line 1027...
1017
 
1027
 
1018
static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
1028
static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
1019
{
-
 
1020
	struct drm_cmdline_mode *cmdline_mode;
1029
{
1021
	cmdline_mode = &fb_connector->cmdline_mode;
-
 
1022
	return cmdline_mode->specified;
1030
	return fb_connector->connector->cmdline_mode.specified;
Line 1023... Line 1031...
1023
}
1031
}
1024
 
1032
 
1025
struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
1033
struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
Line 1029... Line 1037...
1029
	struct drm_display_mode *mode = NULL;
1037
	struct drm_display_mode *mode = NULL;
1030
	bool prefer_non_interlace;
1038
	bool prefer_non_interlace;
Line 1031... Line 1039...
1031
 
1039
 
Line 1032... Line -...
1032
	return NULL;
-
 
1033
 
1040
	return NULL;
1034
	cmdline_mode = &fb_helper_conn->cmdline_mode;
1041
 
Line 1035... Line 1042...
1035
	if (cmdline_mode->specified == false)
1042
	if (cmdline_mode->specified == false)
1036
		return mode;
1043
		return mode;
Line 1113... Line 1120...
1113
	}
1120
	}
1114
}
1121
}
Line 1115... Line 1122...
1115
 
1122
 
1116
static bool drm_target_cloned(struct drm_fb_helper *fb_helper,
1123
static bool drm_target_cloned(struct drm_fb_helper *fb_helper,
-
 
1124
			      struct drm_display_mode **modes,
1117
			      struct drm_display_mode **modes,
1125
			      struct drm_fb_offset *offsets,
1118
			      bool *enabled, int width, int height)
1126
			      bool *enabled, int width, int height)
1119
{
1127
{
1120
	int count, i, j;
1128
	int count, i, j;
1121
	bool can_clone = false;
1129
	bool can_clone = false;
Line 1184... Line 1192...
1184
	}
1192
	}
1185
	DRM_INFO("kms: can't enable cloning when we probably wanted to.\n");
1193
	DRM_INFO("kms: can't enable cloning when we probably wanted to.\n");
1186
	return false;
1194
	return false;
1187
}
1195
}
Line -... Line 1196...
-
 
1196
 
-
 
1197
static int drm_get_tile_offsets(struct drm_fb_helper *fb_helper,
-
 
1198
				struct drm_display_mode **modes,
-
 
1199
				struct drm_fb_offset *offsets,
-
 
1200
				int idx,
-
 
1201
				int h_idx, int v_idx)
-
 
1202
{
-
 
1203
	struct drm_fb_helper_connector *fb_helper_conn;
-
 
1204
	int i;
-
 
1205
	int hoffset = 0, voffset = 0;
-
 
1206
 
-
 
1207
	for (i = 0; i < fb_helper->connector_count; i++) {
-
 
1208
		fb_helper_conn = fb_helper->connector_info[i];
-
 
1209
		if (!fb_helper_conn->connector->has_tile)
-
 
1210
			continue;
-
 
1211
 
-
 
1212
		if (!modes[i] && (h_idx || v_idx)) {
-
 
1213
			DRM_DEBUG_KMS("no modes for connector tiled %d %d\n", i,
-
 
1214
				      fb_helper_conn->connector->base.id);
-
 
1215
			continue;
-
 
1216
		}
-
 
1217
		if (fb_helper_conn->connector->tile_h_loc < h_idx)
-
 
1218
			hoffset += modes[i]->hdisplay;
-
 
1219
 
-
 
1220
		if (fb_helper_conn->connector->tile_v_loc < v_idx)
-
 
1221
			voffset += modes[i]->vdisplay;
-
 
1222
	}
-
 
1223
	offsets[idx].x = hoffset;
-
 
1224
	offsets[idx].y = voffset;
-
 
1225
	DRM_DEBUG_KMS("returned %d %d for %d %d\n", hoffset, voffset, h_idx, v_idx);
-
 
1226
	return 0;
-
 
1227
}
1188
 
1228
 
1189
static bool drm_target_preferred(struct drm_fb_helper *fb_helper,
1229
static bool drm_target_preferred(struct drm_fb_helper *fb_helper,
-
 
1230
				 struct drm_display_mode **modes,
1190
				 struct drm_display_mode **modes,
1231
				 struct drm_fb_offset *offsets,
1191
				 bool *enabled, int width, int height)
1232
				 bool *enabled, int width, int height)
1192
{
1233
{
1193
	struct drm_fb_helper_connector *fb_helper_conn;
1234
	struct drm_fb_helper_connector *fb_helper_conn;
-
 
1235
	int i;
-
 
1236
	uint64_t conn_configured = 0, mask;
-
 
1237
	int tile_pass = 0;
1194
	int i;
1238
	mask = (1 << fb_helper->connector_count) - 1;
1195
 
1239
retry:
1196
	for (i = 0; i < fb_helper->connector_count; i++) {
1240
	for (i = 0; i < fb_helper->connector_count; i++) {
Line -... Line 1241...
-
 
1241
		fb_helper_conn = fb_helper->connector_info[i];
-
 
1242
 
-
 
1243
		if (conn_configured & (1 << i))
1197
		fb_helper_conn = fb_helper->connector_info[i];
1244
			continue;
-
 
1245
 
-
 
1246
		if (enabled[i] == false) {
-
 
1247
			conn_configured |= (1 << i);
-
 
1248
			continue;
-
 
1249
		}
-
 
1250
 
-
 
1251
		/* first pass over all the untiled connectors */
-
 
1252
		if (tile_pass == 0 && fb_helper_conn->connector->has_tile)
-
 
1253
			continue;
-
 
1254
 
-
 
1255
		if (tile_pass == 1) {
-
 
1256
			if (fb_helper_conn->connector->tile_h_loc != 0 ||
-
 
1257
			    fb_helper_conn->connector->tile_v_loc != 0)
-
 
1258
			continue;
-
 
1259
 
-
 
1260
		} else {
-
 
1261
			if (fb_helper_conn->connector->tile_h_loc != tile_pass -1 &&
1198
 
1262
			    fb_helper_conn->connector->tile_v_loc != tile_pass - 1)
Line -... Line 1263...
-
 
1263
			/* if this tile_pass doesn't cover any of the tiles - keep going */
-
 
1264
				continue;
-
 
1265
 
-
 
1266
			/* find the tile offsets for this pass - need
-
 
1267
			   to find all tiles left and above */
1199
		if (enabled[i] == false)
1268
			drm_get_tile_offsets(fb_helper, modes, offsets,
1200
			continue;
1269
					     i, fb_helper_conn->connector->tile_h_loc, fb_helper_conn->connector->tile_v_loc);
Line 1201... Line 1270...
1201
 
1270
		}
1202
		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
1271
		DRM_DEBUG_KMS("looking for cmdline mode on connector %d\n",
1203
			      fb_helper_conn->connector->base.id);
1272
			      fb_helper_conn->connector->base.id);
1204
 
1273
 
1205
		/* got for command line mode first */
1274
		/* got for command line mode first */
1206
		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
1275
		modes[i] = drm_pick_cmdline_mode(fb_helper_conn, width, height);
1207
		if (!modes[i]) {
1276
		if (!modes[i]) {
1208
			DRM_DEBUG_KMS("looking for preferred mode on connector %d\n",
1277
			DRM_DEBUG_KMS("looking for preferred mode on connector %d %d\n",
1209
				      fb_helper_conn->connector->base.id);
1278
				      fb_helper_conn->connector->base.id, fb_helper_conn->connector->tile_group ? fb_helper_conn->connector->tile_group->id : 0);
1210
			modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height);
1279
			modes[i] = drm_has_preferred_mode(fb_helper_conn, width, height);
1211
		}
1280
		}
1212
		/* No preferred modes, pick one off the list */
1281
		/* No preferred modes, pick one off the list */
1213
		if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) {
1282
		if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) {
1214
			list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head)
1283
			list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head)
-
 
1284
				break;
-
 
1285
		}
-
 
1286
		DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name :
-
 
1287
			  "none");
-
 
1288
		conn_configured |= (1 << i);
-
 
1289
	}
1215
				break;
1290
 
1216
		}
1291
	if ((conn_configured & mask) != mask) {
1217
		DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name :
1292
		tile_pass++;
Line 1218... Line 1293...
1218
			  "none");
1293
		goto retry;
Line 1303... Line 1378...
1303
static void drm_setup_crtcs(struct drm_fb_helper *fb_helper)
1378
static void drm_setup_crtcs(struct drm_fb_helper *fb_helper)
1304
{
1379
{
1305
	struct drm_device *dev = fb_helper->dev;
1380
	struct drm_device *dev = fb_helper->dev;
1306
	struct drm_fb_helper_crtc **crtcs;
1381
	struct drm_fb_helper_crtc **crtcs;
1307
	struct drm_display_mode **modes;
1382
	struct drm_display_mode **modes;
-
 
1383
	struct drm_fb_offset *offsets;
1308
	struct drm_mode_set *modeset;
1384
	struct drm_mode_set *modeset;
1309
	bool *enabled;
1385
	bool *enabled;
1310
	int width, height;
1386
	int width, height;
1311
	int i;
1387
	int i;
Line 1317... Line 1393...
1317
 
1393
 
1318
	crtcs = kcalloc(dev->mode_config.num_connector,
1394
	crtcs = kcalloc(dev->mode_config.num_connector,
1319
			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
1395
			sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
1320
	modes = kcalloc(dev->mode_config.num_connector,
1396
	modes = kcalloc(dev->mode_config.num_connector,
-
 
1397
			sizeof(struct drm_display_mode *), GFP_KERNEL);
-
 
1398
	offsets = kcalloc(dev->mode_config.num_connector,
1321
			sizeof(struct drm_display_mode *), GFP_KERNEL);
1399
			  sizeof(struct drm_fb_offset), GFP_KERNEL);
1322
	enabled = kcalloc(dev->mode_config.num_connector,
1400
	enabled = kcalloc(dev->mode_config.num_connector,
1323
			  sizeof(bool), GFP_KERNEL);
1401
			  sizeof(bool), GFP_KERNEL);
1324
	if (!crtcs || !modes || !enabled) {
1402
	if (!crtcs || !modes || !enabled || !offsets) {
1325
		DRM_ERROR("Memory allocation failed\n");
1403
		DRM_ERROR("Memory allocation failed\n");
1326
		goto out;
1404
		goto out;
Line 1327... Line 1405...
1327
	}
1405
	}
Line 1328... Line 1406...
1328
 
1406
 
1329
 
1407
 
-
 
1408
	drm_enable_connectors(fb_helper, enabled);
1330
	drm_enable_connectors(fb_helper, enabled);
1409
 
1331
 
1410
	if (!(fb_helper->funcs->initial_config &&
1332
	if (!(fb_helper->funcs->initial_config &&
1411
	      fb_helper->funcs->initial_config(fb_helper, crtcs, modes,
-
 
1412
					       offsets,
Line 1333... Line 1413...
1333
	      fb_helper->funcs->initial_config(fb_helper, crtcs, modes,
1413
					       enabled, width, height))) {
1334
					       enabled, width, height))) {
1414
		memset(modes, 0, dev->mode_config.num_connector*sizeof(modes[0]));
1335
		memset(modes, 0, dev->mode_config.num_connector*sizeof(modes[0]));
1415
		memset(crtcs, 0, dev->mode_config.num_connector*sizeof(crtcs[0]));
1336
		memset(crtcs, 0, dev->mode_config.num_connector*sizeof(crtcs[0]));
1416
		memset(offsets, 0, dev->mode_config.num_connector*sizeof(offsets[0]));
1337
 
1417
 
Line 1338... Line 1418...
1338
		if (!drm_target_cloned(fb_helper,
1418
		if (!drm_target_cloned(fb_helper, modes, offsets,
1339
				       modes, enabled, width, height) &&
1419
				       enabled, width, height) &&
Line 1356... Line 1436...
1356
	}
1436
	}
Line 1357... Line 1437...
1357
 
1437
 
1358
	for (i = 0; i < fb_helper->connector_count; i++) {
1438
	for (i = 0; i < fb_helper->connector_count; i++) {
1359
		struct drm_display_mode *mode = modes[i];
1439
		struct drm_display_mode *mode = modes[i];
-
 
1440
		struct drm_fb_helper_crtc *fb_crtc = crtcs[i];
1360
		struct drm_fb_helper_crtc *fb_crtc = crtcs[i];
1441
		struct drm_fb_offset *offset = &offsets[i];
Line 1361... Line 1442...
1361
		modeset = &fb_crtc->mode_set;
1442
		modeset = &fb_crtc->mode_set;
1362
 
1443
 
1363
		if (mode && fb_crtc) {
1444
		if (mode && fb_crtc) {
1364
			DRM_DEBUG_KMS("desired mode %s set on crtc %d\n",
1445
			DRM_DEBUG_KMS("desired mode %s set on crtc %d (%d,%d)\n",
-
 
1446
				      mode->name, fb_crtc->mode_set.crtc->base.id, offset->x, offset->y);
-
 
1447
			fb_crtc->desired_mode = mode;
1365
				      mode->name, fb_crtc->mode_set.crtc->base.id);
1448
			fb_crtc->x = offset->x;
1366
			fb_crtc->desired_mode = mode;
1449
			fb_crtc->y = offset->y;
1367
			if (modeset->mode)
1450
			if (modeset->mode)
1368
				drm_mode_destroy(dev, modeset->mode);
1451
				drm_mode_destroy(dev, modeset->mode);
1369
			modeset->mode = drm_mode_duplicate(dev,
1452
			modeset->mode = drm_mode_duplicate(dev,
1370
							   fb_crtc->desired_mode);
1453
							   fb_crtc->desired_mode);
-
 
1454
			modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector;
-
 
1455
			modeset->fb = fb_helper->fb;
1371
			modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector;
1456
			modeset->x = offset->x;
1372
			modeset->fb = fb_helper->fb;
1457
			modeset->y = offset->y;
Line 1373... Line 1458...
1373
		}
1458
		}
1374
	}
1459
	}
1375
 
1460
 
1376
	/* Clear out any old modes if there are no more connected outputs. */
1461
	/* Clear out any old modes if there are no more connected outputs. */
1377
	for (i = 0; i < fb_helper->crtc_count; i++) {
1462
	for (i = 0; i < fb_helper->crtc_count; i++) {
1378
		modeset = &fb_helper->crtc_info[i].mode_set;
-
 
1379
		if (modeset->num_connectors == 0) {
1463
		modeset = &fb_helper->crtc_info[i].mode_set;
1380
			BUG_ON(modeset->fb);
1464
		if (modeset->num_connectors == 0) {
1381
			BUG_ON(modeset->num_connectors);
1465
			BUG_ON(modeset->fb);
1382
			if (modeset->mode)
1466
			if (modeset->mode)
1383
				drm_mode_destroy(dev, modeset->mode);
1467
				drm_mode_destroy(dev, modeset->mode);
1384
			modeset->mode = NULL;
1468
			modeset->mode = NULL;
1385
		}
1469
		}
1386
	}
1470
	}
-
 
1471
out:
1387
out:
1472
	kfree(crtcs);
1388
	kfree(crtcs);
1473
	kfree(modes);
Line 1389... Line 1474...
1389
	kfree(modes);
1474
	kfree(offsets);
1390
	kfree(enabled);
1475
	kfree(enabled);
Line 1414... Line 1499...
1414
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
1499
bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel)
1415
{
1500
{
1416
	struct drm_device *dev = fb_helper->dev;
1501
	struct drm_device *dev = fb_helper->dev;
1417
	int count = 0;
1502
	int count = 0;
Line 1418... Line -...
1418
 
-
 
1419
//   drm_fb_helper_parse_command_line(fb_helper);
-
 
1420
 
1503
 
1421
	mutex_lock(&dev->mode_config.mutex);
1504
	mutex_lock(&dev->mode_config.mutex);
1422
	count = drm_fb_helper_probe_connector_modes(fb_helper,
1505
	count = drm_fb_helper_probe_connector_modes(fb_helper,
1423
						    dev->mode_config.max_width,
1506
						    dev->mode_config.max_width,
1424
						    dev->mode_config.max_height);
1507
						    dev->mode_config.max_height);