diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-10-30 17:50:26 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-10-31 07:08:50 -0400 |
commit | 8a5e6aeb30ecaf8f11a99c0d008c8935cd6fba9f (patch) | |
tree | 51cc561fd5111c82d4d1eafd21f55c4e365ad1d0 | |
parent | 40da17c29be95acf5543c97c8bc2fbb5991c3e39 (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.c | 29 |
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 | |||
728 | out: | ||
729 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
730 | return ret; | ||
721 | } | 731 | } |
722 | 732 | ||
723 | static int | 733 | static 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 | ||