View | Details | Raw Unified | Return to bug 24982 | Differences between
and this patch

Collapse All | Expand All

(-)a/drivers/gpu/drm/drm_crtc_helper.c (-13 / +44 lines)
Lines 666-677 int drm_crtc_helper_set_config(struct drm_mode_set *set) Link Here
666
				ret = -EINVAL;
666
				ret = -EINVAL;
667
				goto fail;
667
				goto fail;
668
			}
668
			}
669
			DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
670
			for (i = 0; i < set->num_connectors; i++) {
671
				DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
672
					      drm_get_connector_name(set->connectors[i]));
673
				set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
674
			}
675
		}
669
		}
676
		drm_helper_disable_unused_functions(dev);
670
		drm_helper_disable_unused_functions(dev);
677
	} else if (fb_changed) {
671
	} else if (fb_changed) {
Lines 689-694 int drm_crtc_helper_set_config(struct drm_mode_set *set) Link Here
689
		}
683
		}
690
	}
684
	}
691
685
686
	DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
687
	for (i = 0; i < set->num_connectors; i++) {
688
		struct drm_connector *connector = set->connectors[i];
689
		DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", connector->base.id,
690
			      drm_get_connector_name(connector));
691
		drm_connector_set_dpms(connector, DRM_MODE_DPMS_ON);
692
	}
693
692
	kfree(save_connectors);
694
	kfree(save_connectors);
693
	kfree(save_encoders);
695
	kfree(save_encoders);
694
	kfree(save_crtcs);
696
	kfree(save_crtcs);
Lines 718-723 fail: Link Here
718
}
720
}
719
EXPORT_SYMBOL(drm_crtc_helper_set_config);
721
EXPORT_SYMBOL(drm_crtc_helper_set_config);
720
722
723
int drm_connector_get_dpms(struct drm_connector *connector)
724
{
725
	uint64_t val;
726
	struct drm_property *dpms_prop =
727
		connector->dev->mode_config.dpms_property;
728
	int ret;
729
730
	ret = drm_connector_property_get_value(connector, dpms_prop, &val);
731
	if (ret)
732
		DRM_DEBUG_KMS("failed to fetch DPMS state for connector\n");
733
	return (int)val;
734
}
735
EXPORT_SYMBOL(drm_connector_get_dpms);
736
737
int drm_connector_set_dpms(struct drm_connector *connector, int mode)
738
{
739
	struct drm_property *dpms_prop =
740
		connector->dev->mode_config.dpms_property;
741
	int ret;
742
743
	if (connector->funcs->dpms)
744
		(*connector->funcs->dpms)(connector, mode);
745
	ret = drm_connector_property_set_value(connector, dpms_prop, mode);
746
747
	return ret;
748
}
749
EXPORT_SYMBOL(drm_connector_set_dpms);
750
721
static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
751
static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder)
722
{
752
{
723
	int dpms = DRM_MODE_DPMS_OFF;
753
	int dpms = DRM_MODE_DPMS_OFF;
Lines 726-733 static int drm_helper_choose_encoder_dpms(struct drm_encoder *encoder) Link Here
726
756
727
	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
757
	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
728
		if (connector->encoder == encoder)
758
		if (connector->encoder == encoder)
729
			if (connector->dpms < dpms)
759
			if (drm_connector_get_dpms(connector) < dpms)
730
				dpms = connector->dpms;
760
				dpms = drm_connector_get_dpms(connector);
731
	return dpms;
761
	return dpms;
732
}
762
}
733
763
Lines 739-746 static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc) Link Here
739
769
740
	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
770
	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
741
		if (connector->encoder && connector->encoder->crtc == crtc)
771
		if (connector->encoder && connector->encoder->crtc == crtc)
742
			if (connector->dpms < dpms)
772
			if (drm_connector_get_dpms(connector) < dpms)
743
				dpms = connector->dpms;
773
				dpms = drm_connector_get_dpms(connector);
744
	return dpms;
774
	return dpms;
745
}
775
}
746
776
Lines 758-768 void drm_helper_connector_dpms(struct drm_connector *connector, int mode) Link Here
758
	struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;
788
	struct drm_crtc *crtc = encoder ? encoder->crtc : NULL;
759
	int old_dpms;
789
	int old_dpms;
760
790
761
	if (mode == connector->dpms)
791
	old_dpms = drm_connector_get_dpms(connector);
792
793
	if (mode == old_dpms)
762
		return;
794
		return;
763
795
764
	old_dpms = connector->dpms;
796
	drm_connector_set_dpms(connector, mode);
765
	connector->dpms = mode;
766
797
767
	/* from off to on, do crtc then encoder */
798
	/* from off to on, do crtc then encoder */
768
	if (mode < old_dpms) {
799
	if (mode < old_dpms) {
(-)a/drivers/gpu/drm/drm_fb_helper.c (-8 / +2 lines)
Lines 326-335 static void drm_fb_helper_on(struct fb_info *info) Link Here
326
		/* Walk the connectors & encoders on this fb turning them on */
326
		/* Walk the connectors & encoders on this fb turning them on */
327
		for (j = 0; j < fb_helper->connector_count; j++) {
327
		for (j = 0; j < fb_helper->connector_count; j++) {
328
			connector = fb_helper->connector_info[j]->connector;
328
			connector = fb_helper->connector_info[j]->connector;
329
			connector->dpms = DRM_MODE_DPMS_ON;
329
			drm_connector_set_dpms(connector, DRM_MODE_DPMS_ON);
330
			drm_connector_property_set_value(connector,
331
							 dev->mode_config.dpms_property,
332
							 DRM_MODE_DPMS_ON);
333
		}
330
		}
334
		/* Found a CRTC on this fb, now find encoders */
331
		/* Found a CRTC on this fb, now find encoders */
335
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
332
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
Lines 369-378 static void drm_fb_helper_off(struct fb_info *info, int dpms_mode) Link Here
369
		/* Walk the connectors on this fb and mark them off */
366
		/* Walk the connectors on this fb and mark them off */
370
		for (j = 0; j < fb_helper->connector_count; j++) {
367
		for (j = 0; j < fb_helper->connector_count; j++) {
371
			connector = fb_helper->connector_info[j]->connector;
368
			connector = fb_helper->connector_info[j]->connector;
372
			connector->dpms = dpms_mode;
369
			drm_connector_set_dpms(connector, dpms_mode);
373
			drm_connector_property_set_value(connector,
374
							 dev->mode_config.dpms_property,
375
							 dpms_mode);
376
		}
370
		}
377
		/* Found a CRTC on this fb, now find encoders */
371
		/* Found a CRTC on this fb, now find encoders */
378
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
372
		list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
(-)a/drivers/gpu/drm/i2c/ch7006_drv.c (-2 / +2 lines)
Lines 315-321 static int ch7006_encoder_set_property(struct drm_encoder *encoder, Link Here
315
		ch7006_load_reg(client, state, CH7006_VPOS);
315
		ch7006_load_reg(client, state, CH7006_VPOS);
316
316
317
	} else if (property == conf->tv_mode_property) {
317
	} else if (property == conf->tv_mode_property) {
318
		if (connector->dpms != DRM_MODE_DPMS_OFF)
318
		if (drm_connector_get_dpms(connector) != DRM_MODE_DPMS_OFF)
319
			return -EINVAL;
319
			return -EINVAL;
320
320
321
		priv->norm = val;
321
		priv->norm = val;
Lines 344-350 static int ch7006_encoder_set_property(struct drm_encoder *encoder, Link Here
344
		ch7006_load_reg(client, state, CH7006_FFILTER);
344
		ch7006_load_reg(client, state, CH7006_FFILTER);
345
345
346
	} else if (property == priv->scale_property) {
346
	} else if (property == priv->scale_property) {
347
		if (connector->dpms != DRM_MODE_DPMS_OFF)
347
		if (drm_connector_get_dpms(connector) != DRM_MODE_DPMS_OFF)
348
			return -EINVAL;
348
			return -EINVAL;
349
349
350
		priv->scale = val;
350
		priv->scale = val;
(-)a/drivers/gpu/drm/nouveau/nv17_tv.c (-1 / +1 lines)
Lines 722-728 static int nv17_tv_set_property(struct drm_encoder *encoder, Link Here
722
			nv17_tv_update_rescaler(encoder);
722
			nv17_tv_update_rescaler(encoder);
723
723
724
	} else if (property == conf->tv_mode_property) {
724
	} else if (property == conf->tv_mode_property) {
725
		if (connector->dpms != DRM_MODE_DPMS_OFF)
725
		if (drm_connector_get_dpms(connector) != DRM_MODE_DPMS_OFF)
726
			return -EINVAL;
726
			return -EINVAL;
727
727
728
		tv_enc->tv_norm = val;
728
		tv_enc->tv_norm = val;
(-)a/include/drm/drm_crtc.h (-3 / +3 lines)
Lines 510-518 struct drm_connector { Link Here
510
510
511
	uint8_t polled; /* DRM_CONNECTOR_POLL_* */
511
	uint8_t polled; /* DRM_CONNECTOR_POLL_* */
512
512
513
	/* requested DPMS state */
514
	int dpms;
515
516
	void *helper_private;
513
	void *helper_private;
517
514
518
	/* forced on connector */
515
	/* forced on connector */
Lines 696-701 extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, Link Here
696
extern void drm_mode_connector_list_update(struct drm_connector *connector);
693
extern void drm_mode_connector_list_update(struct drm_connector *connector);
697
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
694
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
698
						struct edid *edid);
695
						struct edid *edid);
696
extern int drm_connector_set_dpms(struct drm_connector *connector, int mode);
697
extern int drm_connector_get_dpms(struct drm_connector *connector);
698
699
extern int drm_connector_property_set_value(struct drm_connector *connector,
699
extern int drm_connector_property_set_value(struct drm_connector *connector,
700
					 struct drm_property *property,
700
					 struct drm_property *property,
701
					 uint64_t value);
701
					 uint64_t value);

Return to bug 24982