Subversion Repositories Kolibri OS

Rev

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

Rev 4075 Rev 4104
Line 255... Line 255...
255
static void
255
static void
256
drm_encoder_disable(struct drm_encoder *encoder)
256
drm_encoder_disable(struct drm_encoder *encoder)
257
{
257
{
258
	struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
258
	struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
Line -... Line 259...
-
 
259
 
-
 
260
	if (encoder->bridge)
-
 
261
		encoder->bridge->funcs->disable(encoder->bridge);
259
 
262
 
260
	if (encoder_funcs->disable)
263
	if (encoder_funcs->disable)
261
		(*encoder_funcs->disable)(encoder);
264
		(*encoder_funcs->disable)(encoder);
262
	else
265
	else
-
 
266
		(*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
-
 
267
 
-
 
268
	if (encoder->bridge)
263
		(*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
269
		encoder->bridge->funcs->post_disable(encoder->bridge);
Line 264... Line 270...
264
}
270
}
265
 
271
 
266
/**
272
/**
Line 422... Line 428...
422
	 */
428
	 */
423
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
429
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Line 424... Line 430...
424
 
430
 
425
		if (encoder->crtc != crtc)
431
		if (encoder->crtc != crtc)
-
 
432
			continue;
-
 
433
 
-
 
434
		if (encoder->bridge && encoder->bridge->funcs->mode_fixup) {
-
 
435
			ret = encoder->bridge->funcs->mode_fixup(
-
 
436
					encoder->bridge, mode, adjusted_mode);
-
 
437
			if (!ret) {
-
 
438
				DRM_DEBUG_KMS("Bridge fixup failed\n");
-
 
439
				goto done;
-
 
440
			}
-
 
441
		}
426
			continue;
442
 
427
		encoder_funcs = encoder->helper_private;
443
		encoder_funcs = encoder->helper_private;
428
		if (!(ret = encoder_funcs->mode_fixup(encoder, mode,
444
		if (!(ret = encoder_funcs->mode_fixup(encoder, mode,
429
						      adjusted_mode))) {
445
						      adjusted_mode))) {
430
			DRM_DEBUG_KMS("Encoder fixup failed\n");
446
			DRM_DEBUG_KMS("Encoder fixup failed\n");
Line 441... Line 457...
441
	/* Prepare the encoders and CRTCs before setting the mode. */
457
	/* Prepare the encoders and CRTCs before setting the mode. */
442
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
458
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Line 443... Line 459...
443
 
459
 
444
		if (encoder->crtc != crtc)
460
		if (encoder->crtc != crtc)
-
 
461
			continue;
-
 
462
 
-
 
463
		if (encoder->bridge)
-
 
464
			encoder->bridge->funcs->disable(encoder->bridge);
445
			continue;
465
 
446
		encoder_funcs = encoder->helper_private;
466
		encoder_funcs = encoder->helper_private;
447
		/* Disable the encoders as the first thing we do. */
467
		/* Disable the encoders as the first thing we do. */
-
 
468
		encoder_funcs->prepare(encoder);
-
 
469
 
-
 
470
		if (encoder->bridge)
448
		encoder_funcs->prepare(encoder);
471
			encoder->bridge->funcs->post_disable(encoder->bridge);
Line 449... Line 472...
449
	}
472
	}
Line 450... Line 473...
450
 
473
 
Line 467... Line 490...
467
		DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n",
490
		DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n",
468
			encoder->base.id, drm_get_encoder_name(encoder),
491
			encoder->base.id, drm_get_encoder_name(encoder),
469
			mode->base.id, mode->name);
492
			mode->base.id, mode->name);
470
		encoder_funcs = encoder->helper_private;
493
		encoder_funcs = encoder->helper_private;
471
		encoder_funcs->mode_set(encoder, mode, adjusted_mode);
494
		encoder_funcs->mode_set(encoder, mode, adjusted_mode);
-
 
495
 
-
 
496
		if (encoder->bridge && encoder->bridge->funcs->mode_set)
-
 
497
			encoder->bridge->funcs->mode_set(encoder->bridge, mode,
-
 
498
					adjusted_mode);
472
	}
499
	}
Line 473... Line 500...
473
 
500
 
474
	/* Now enable the clocks, plane, pipe, and connectors that we set up. */
501
	/* Now enable the clocks, plane, pipe, and connectors that we set up. */
Line 475... Line 502...
475
	crtc_funcs->commit(crtc);
502
	crtc_funcs->commit(crtc);
Line 476... Line 503...
476
 
503
 
477
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
504
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Line -... Line 505...
-
 
505
 
-
 
506
		if (encoder->crtc != crtc)
-
 
507
			continue;
478
 
508
 
479
		if (encoder->crtc != crtc)
509
		if (encoder->bridge)
Line -... Line 510...
-
 
510
			encoder->bridge->funcs->pre_enable(encoder->bridge);
-
 
511
 
480
			continue;
512
		encoder_funcs = encoder->helper_private;
Line 481... Line 513...
481
 
513
		encoder_funcs->commit(encoder);
482
		encoder_funcs = encoder->helper_private;
514
 
Line 828... Line 860...
828
			if (connector->dpms < dpms)
860
			if (connector->dpms < dpms)
829
				dpms = connector->dpms;
861
				dpms = connector->dpms;
830
	return dpms;
862
	return dpms;
831
}
863
}
Line -... Line 864...
-
 
864
 
-
 
865
/* Helper which handles bridge ordering around encoder dpms */
-
 
866
static void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode)
-
 
867
{
-
 
868
	struct drm_bridge *bridge = encoder->bridge;
-
 
869
	struct drm_encoder_helper_funcs *encoder_funcs;
-
 
870
 
-
 
871
	if (bridge) {
-
 
872
		if (mode == DRM_MODE_DPMS_ON)
-
 
873
			bridge->funcs->pre_enable(bridge);
-
 
874
		else
-
 
875
			bridge->funcs->disable(bridge);
-
 
876
	}
-
 
877
 
-
 
878
	encoder_funcs = encoder->helper_private;
-
 
879
	if (encoder_funcs->dpms)
-
 
880
		encoder_funcs->dpms(encoder, mode);
-
 
881
 
-
 
882
	if (bridge) {
-
 
883
		if (mode == DRM_MODE_DPMS_ON)
-
 
884
			bridge->funcs->enable(bridge);
-
 
885
		else
-
 
886
			bridge->funcs->post_disable(bridge);
-
 
887
	}
-
 
888
}
832
 
889
 
833
static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc)
890
static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc)
834
{
891
{
835
	int dpms = DRM_MODE_DPMS_OFF;
892
	int dpms = DRM_MODE_DPMS_OFF;
836
	struct drm_connector *connector;
893
	struct drm_connector *connector;
Line 855... Line 912...
855
 */
912
 */
856
void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
913
void drm_helper_connector_dpms(struct drm_connector *connector, int mode)
857
{
914
{
858
	struct drm_encoder *encoder = connector->encoder;
915
	struct drm_encoder *encoder = connector->encoder;
859
	struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;
916
	struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;
860
	int old_dpms;
917
	int old_dpms, encoder_dpms = DRM_MODE_DPMS_OFF;
Line 861... Line 918...
861
 
918
 
862
	if (mode == connector->dpms)
919
	if (mode == connector->dpms)
Line 863... Line 920...
863
		return;
920
		return;
864
 
921
 
Line -... Line 922...
-
 
922
	old_dpms = connector->dpms;
-
 
923
	connector->dpms = mode;
-
 
924
 
865
	old_dpms = connector->dpms;
925
	if (encoder)
866
	connector->dpms = mode;
926
		encoder_dpms = drm_helper_choose_encoder_dpms(encoder);
867
 
927
 
868
	/* from off to on, do crtc then encoder */
928
	/* from off to on, do crtc then encoder */
869
	if (mode < old_dpms) {
929
	if (mode < old_dpms) {
870
		if (crtc) {
930
		if (crtc) {
871
			struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
931
			struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
872
			if (crtc_funcs->dpms)
932
			if (crtc_funcs->dpms)
873
				(*crtc_funcs->dpms) (crtc,
933
				(*crtc_funcs->dpms) (crtc,
874
						     drm_helper_choose_crtc_dpms(crtc));
-
 
875
		}
-
 
876
		if (encoder) {
-
 
877
			struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
934
						     drm_helper_choose_crtc_dpms(crtc));
878
			if (encoder_funcs->dpms)
-
 
879
				(*encoder_funcs->dpms) (encoder,
935
		}
Line 880... Line 936...
880
							drm_helper_choose_encoder_dpms(encoder));
936
		if (encoder)
881
		}
937
			drm_helper_encoder_dpms(encoder, encoder_dpms);
882
	}
938
	}
883
 
-
 
884
	/* from on to off, do encoder then crtc */
-
 
885
	if (mode > old_dpms) {
-
 
886
		if (encoder) {
939
 
887
			struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
-
 
888
			if (encoder_funcs->dpms)
940
	/* from on to off, do encoder then crtc */
889
				(*encoder_funcs->dpms) (encoder,
941
	if (mode > old_dpms) {
890
							drm_helper_choose_encoder_dpms(encoder));
942
		if (encoder)
891
		}
943
			drm_helper_encoder_dpms(encoder, encoder_dpms);
892
		if (crtc) {
944
		if (crtc) {
Line 922... Line 974...
922
 
974
 
923
int drm_helper_resume_force_mode(struct drm_device *dev)
975
int drm_helper_resume_force_mode(struct drm_device *dev)
924
{
976
{
925
	struct drm_crtc *crtc;
977
	struct drm_crtc *crtc;
926
	struct drm_encoder *encoder;
-
 
927
	struct drm_encoder_helper_funcs *encoder_funcs;
978
	struct drm_encoder *encoder;
928
	struct drm_crtc_helper_funcs *crtc_funcs;
979
	struct drm_crtc_helper_funcs *crtc_funcs;
Line 929... Line 980...
929
	int ret;
980
	int ret, encoder_dpms;
Line 930... Line 981...
930
 
981
 
931
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
982
	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
Line 944... Line 995...
944
			list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
995
			list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Line 945... Line 996...
945
 
996
 
946
				if(encoder->crtc != crtc)
997
				if(encoder->crtc != crtc)
Line 947... Line 998...
947
					continue;
998
					continue;
948
 
999
 
949
				encoder_funcs = encoder->helper_private;
-
 
-
 
1000
				encoder_dpms = drm_helper_choose_encoder_dpms(
950
				if (encoder_funcs->dpms)
1001
							encoder);
951
					(*encoder_funcs->dpms) (encoder,
1002
 
Line 952... Line 1003...
952
								drm_helper_choose_encoder_dpms(encoder));
1003
				drm_helper_encoder_dpms(encoder, encoder_dpms);
953
			}
1004
			}
954
 
1005