aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-10-30 17:50:26 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-10-31 07:08:50 -0400
commit8a5e6aeb30ecaf8f11a99c0d008c8935cd6fba9f (patch)
tree51cc561fd5111c82d4d1eafd21f55c4e365ad1d0
parent40da17c29be95acf5543c97c8bc2fbb5991c3e39 (diff)
drm/i915: turn the eDP VDD on for any i2c transactions
If the eDP output is disabled, then we try to use /dev/i2c-X file to do i2c transations, we get a WARN from intel_dp_check_edp() saying we're trying to do AUX communication with the panel off. So this commit reorganizes the code so we enable the VDD at intel_dp_i2c_aux_ch() instead of just the callers inside i915.ko. This fixes the i2c subtest from the pc8 test of intel-gpu-tools on machines that have eDP panels. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index cea8624a0c1a..2dbdcd103ead 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -623,6 +623,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
623 int reply_bytes; 623 int reply_bytes;
624 int ret; 624 int ret;
625 625
626 ironlake_edp_panel_vdd_on(intel_dp);
626 intel_dp_check_edp(intel_dp); 627 intel_dp_check_edp(intel_dp);
627 /* Set up the command byte */ 628 /* Set up the command byte */
628 if (mode & MODE_I2C_READ) 629 if (mode & MODE_I2C_READ)
@@ -665,7 +666,7 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
665 reply, reply_bytes); 666 reply, reply_bytes);
666 if (ret < 0) { 667 if (ret < 0) {
667 DRM_DEBUG_KMS("aux_ch failed %d\n", ret); 668 DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
668 return ret; 669 goto out;
669 } 670 }
670 671
671 switch (reply[0] & AUX_NATIVE_REPLY_MASK) { 672 switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
@@ -676,7 +677,8 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
676 break; 677 break;
677 case AUX_NATIVE_REPLY_NACK: 678 case AUX_NATIVE_REPLY_NACK:
678 DRM_DEBUG_KMS("aux_ch native nack\n"); 679 DRM_DEBUG_KMS("aux_ch native nack\n");
679 return -EREMOTEIO; 680 ret = -EREMOTEIO;
681 goto out;
680 case AUX_NATIVE_REPLY_DEFER: 682 case AUX_NATIVE_REPLY_DEFER:
681 /* 683 /*
682 * For now, just give more slack to branch devices. We 684 * For now, just give more slack to branch devices. We
@@ -694,7 +696,8 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
694 default: 696 default:
695 DRM_ERROR("aux_ch invalid native reply 0x%02x\n", 697 DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
696 reply[0]); 698 reply[0]);
697 return -EREMOTEIO; 699 ret = -EREMOTEIO;
700 goto out;
698 } 701 }
699 702
700 switch (reply[0] & AUX_I2C_REPLY_MASK) { 703 switch (reply[0] & AUX_I2C_REPLY_MASK) {
@@ -702,22 +705,29 @@ intel_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
702 if (mode == MODE_I2C_READ) { 705 if (mode == MODE_I2C_READ) {
703 *read_byte = reply[1]; 706 *read_byte = reply[1];
704 } 707 }
705 return reply_bytes - 1; 708 ret = reply_bytes - 1;
709 goto out;
706 case AUX_I2C_REPLY_NACK: 710 case AUX_I2C_REPLY_NACK:
707 DRM_DEBUG_KMS("aux_i2c nack\n"); 711 DRM_DEBUG_KMS("aux_i2c nack\n");
708 return -EREMOTEIO; 712 ret = -EREMOTEIO;
713 goto out;
709 case AUX_I2C_REPLY_DEFER: 714 case AUX_I2C_REPLY_DEFER:
710 DRM_DEBUG_KMS("aux_i2c defer\n"); 715 DRM_DEBUG_KMS("aux_i2c defer\n");
711 udelay(100); 716 udelay(100);
712 break; 717 break;
713 default: 718 default:
714 DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]); 719 DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
715 return -EREMOTEIO; 720 ret = -EREMOTEIO;
721 goto out;
716 } 722 }
717 } 723 }
718 724
719 DRM_ERROR("too many retries, giving up\n"); 725 DRM_ERROR("too many retries, giving up\n");
720 return -EREMOTEIO; 726 ret = -EREMOTEIO;
727
728out:
729 ironlake_edp_panel_vdd_off(intel_dp, false);
730 return ret;
721} 731}
722 732
723static int 733static int
@@ -739,9 +749,7 @@ intel_dp_i2c_init(struct intel_dp *intel_dp,
739 intel_dp->adapter.algo_data = &intel_dp->algo; 749 intel_dp->adapter.algo_data = &intel_dp->algo;
740 intel_dp->adapter.dev.parent = &intel_connector->base.kdev; 750 intel_dp->adapter.dev.parent = &intel_connector->base.kdev;
741 751
742 ironlake_edp_panel_vdd_on(intel_dp);
743 ret = i2c_dp_aux_add_bus(&intel_dp->adapter); 752 ret = i2c_dp_aux_add_bus(&intel_dp->adapter);
744 ironlake_edp_panel_vdd_off(intel_dp, false);
745 return ret; 753 return ret;
746} 754}
747 755
@@ -3478,7 +3486,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
3478 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, 3486 intel_dp_init_panel_power_sequencer_registers(dev, intel_dp,
3479 &power_seq); 3487 &power_seq);
3480 3488
3481 ironlake_edp_panel_vdd_on(intel_dp);
3482 edid = drm_get_edid(connector, &intel_dp->adapter); 3489 edid = drm_get_edid(connector, &intel_dp->adapter);
3483 if (edid) { 3490 if (edid) {
3484 if (drm_add_edid_modes(connector, edid)) { 3491 if (drm_add_edid_modes(connector, edid)) {
@@ -3510,8 +3517,6 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
3510 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED; 3517 fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;
3511 } 3518 }
3512 3519
3513 ironlake_edp_panel_vdd_off(intel_dp, false);
3514
3515 intel_panel_init(&intel_connector->panel, fixed_mode); 3520 intel_panel_init(&intel_connector->panel, fixed_mode);
3516 intel_panel_setup_backlight(connector); 3521 intel_panel_setup_backlight(connector);
3517 3522