diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 216 |
1 files changed, 189 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 6770ae88370d..a6ff15ac548a 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -40,6 +40,8 @@ | |||
| 40 | 40 | ||
| 41 | #define DP_LINK_CONFIGURATION_SIZE 9 | 41 | #define DP_LINK_CONFIGURATION_SIZE 9 |
| 42 | 42 | ||
| 43 | #define IS_eDP(i) ((i)->type == INTEL_OUTPUT_EDP) | ||
| 44 | |||
| 43 | struct intel_dp_priv { | 45 | struct intel_dp_priv { |
| 44 | uint32_t output_reg; | 46 | uint32_t output_reg; |
| 45 | uint32_t DP; | 47 | uint32_t DP; |
| @@ -63,6 +65,19 @@ intel_dp_link_train(struct intel_output *intel_output, uint32_t DP, | |||
| 63 | static void | 65 | static void |
| 64 | intel_dp_link_down(struct intel_output *intel_output, uint32_t DP); | 66 | intel_dp_link_down(struct intel_output *intel_output, uint32_t DP); |
| 65 | 67 | ||
| 68 | void | ||
| 69 | intel_edp_link_config (struct intel_output *intel_output, | ||
| 70 | int *lane_num, int *link_bw) | ||
| 71 | { | ||
| 72 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | ||
| 73 | |||
| 74 | *lane_num = dp_priv->lane_count; | ||
| 75 | if (dp_priv->link_bw == DP_LINK_BW_1_62) | ||
| 76 | *link_bw = 162000; | ||
| 77 | else if (dp_priv->link_bw == DP_LINK_BW_2_7) | ||
| 78 | *link_bw = 270000; | ||
| 79 | } | ||
| 80 | |||
| 66 | static int | 81 | static int |
| 67 | intel_dp_max_lane_count(struct intel_output *intel_output) | 82 | intel_dp_max_lane_count(struct intel_output *intel_output) |
| 68 | { | 83 | { |
| @@ -206,7 +221,13 @@ intel_dp_aux_ch(struct intel_output *intel_output, | |||
| 206 | * and would like to run at 2MHz. So, take the | 221 | * and would like to run at 2MHz. So, take the |
| 207 | * hrawclk value and divide by 2 and use that | 222 | * hrawclk value and divide by 2 and use that |
| 208 | */ | 223 | */ |
| 209 | aux_clock_divider = intel_hrawclk(dev) / 2; | 224 | if (IS_eDP(intel_output)) |
| 225 | aux_clock_divider = 225; /* eDP input clock at 450Mhz */ | ||
| 226 | else if (IS_IGDNG(dev)) | ||
| 227 | aux_clock_divider = 62; /* IGDNG: input clock fixed at 125Mhz */ | ||
| 228 | else | ||
| 229 | aux_clock_divider = intel_hrawclk(dev) / 2; | ||
| 230 | |||
| 210 | /* Must try at least 3 times according to DP spec */ | 231 | /* Must try at least 3 times according to DP spec */ |
| 211 | for (try = 0; try < 5; try++) { | 232 | for (try = 0; try < 5; try++) { |
| 212 | /* Load the send data into the aux channel data registers */ | 233 | /* Load the send data into the aux channel data registers */ |
| @@ -236,7 +257,7 @@ intel_dp_aux_ch(struct intel_output *intel_output, | |||
| 236 | } | 257 | } |
| 237 | 258 | ||
| 238 | /* Clear done status and any errors */ | 259 | /* Clear done status and any errors */ |
| 239 | I915_WRITE(ch_ctl, (ctl | | 260 | I915_WRITE(ch_ctl, (status | |
| 240 | DP_AUX_CH_CTL_DONE | | 261 | DP_AUX_CH_CTL_DONE | |
| 241 | DP_AUX_CH_CTL_TIME_OUT_ERROR | | 262 | DP_AUX_CH_CTL_TIME_OUT_ERROR | |
| 242 | DP_AUX_CH_CTL_RECEIVE_ERROR)); | 263 | DP_AUX_CH_CTL_RECEIVE_ERROR)); |
| @@ -295,7 +316,7 @@ intel_dp_aux_native_write(struct intel_output *intel_output, | |||
| 295 | return -1; | 316 | return -1; |
| 296 | msg[0] = AUX_NATIVE_WRITE << 4; | 317 | msg[0] = AUX_NATIVE_WRITE << 4; |
| 297 | msg[1] = address >> 8; | 318 | msg[1] = address >> 8; |
| 298 | msg[2] = address; | 319 | msg[2] = address & 0xff; |
| 299 | msg[3] = send_bytes - 1; | 320 | msg[3] = send_bytes - 1; |
| 300 | memcpy(&msg[4], send, send_bytes); | 321 | memcpy(&msg[4], send, send_bytes); |
| 301 | msg_bytes = send_bytes + 4; | 322 | msg_bytes = send_bytes + 4; |
| @@ -387,8 +408,8 @@ intel_dp_i2c_init(struct intel_output *intel_output, const char *name) | |||
| 387 | memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter)); | 408 | memset(&dp_priv->adapter, '\0', sizeof (dp_priv->adapter)); |
| 388 | dp_priv->adapter.owner = THIS_MODULE; | 409 | dp_priv->adapter.owner = THIS_MODULE; |
| 389 | dp_priv->adapter.class = I2C_CLASS_DDC; | 410 | dp_priv->adapter.class = I2C_CLASS_DDC; |
| 390 | strncpy (dp_priv->adapter.name, name, sizeof dp_priv->adapter.name - 1); | 411 | strncpy (dp_priv->adapter.name, name, sizeof(dp_priv->adapter.name) - 1); |
| 391 | dp_priv->adapter.name[sizeof dp_priv->adapter.name - 1] = '\0'; | 412 | dp_priv->adapter.name[sizeof(dp_priv->adapter.name) - 1] = '\0'; |
| 392 | dp_priv->adapter.algo_data = &dp_priv->algo; | 413 | dp_priv->adapter.algo_data = &dp_priv->algo; |
| 393 | dp_priv->adapter.dev.parent = &intel_output->base.kdev; | 414 | dp_priv->adapter.dev.parent = &intel_output->base.kdev; |
| 394 | 415 | ||
| @@ -493,22 +514,40 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode, | |||
| 493 | intel_dp_compute_m_n(3, lane_count, | 514 | intel_dp_compute_m_n(3, lane_count, |
| 494 | mode->clock, adjusted_mode->clock, &m_n); | 515 | mode->clock, adjusted_mode->clock, &m_n); |
| 495 | 516 | ||
| 496 | if (intel_crtc->pipe == 0) { | 517 | if (IS_IGDNG(dev)) { |
| 497 | I915_WRITE(PIPEA_GMCH_DATA_M, | 518 | if (intel_crtc->pipe == 0) { |
| 498 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 519 | I915_WRITE(TRANSA_DATA_M1, |
| 499 | m_n.gmch_m); | 520 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
| 500 | I915_WRITE(PIPEA_GMCH_DATA_N, | 521 | m_n.gmch_m); |
| 501 | m_n.gmch_n); | 522 | I915_WRITE(TRANSA_DATA_N1, m_n.gmch_n); |
| 502 | I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); | 523 | I915_WRITE(TRANSA_DP_LINK_M1, m_n.link_m); |
| 503 | I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); | 524 | I915_WRITE(TRANSA_DP_LINK_N1, m_n.link_n); |
| 525 | } else { | ||
| 526 | I915_WRITE(TRANSB_DATA_M1, | ||
| 527 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
| 528 | m_n.gmch_m); | ||
| 529 | I915_WRITE(TRANSB_DATA_N1, m_n.gmch_n); | ||
| 530 | I915_WRITE(TRANSB_DP_LINK_M1, m_n.link_m); | ||
| 531 | I915_WRITE(TRANSB_DP_LINK_N1, m_n.link_n); | ||
| 532 | } | ||
| 504 | } else { | 533 | } else { |
| 505 | I915_WRITE(PIPEB_GMCH_DATA_M, | 534 | if (intel_crtc->pipe == 0) { |
| 506 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | 535 | I915_WRITE(PIPEA_GMCH_DATA_M, |
| 507 | m_n.gmch_m); | 536 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | |
| 508 | I915_WRITE(PIPEB_GMCH_DATA_N, | 537 | m_n.gmch_m); |
| 509 | m_n.gmch_n); | 538 | I915_WRITE(PIPEA_GMCH_DATA_N, |
| 510 | I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); | 539 | m_n.gmch_n); |
| 511 | I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); | 540 | I915_WRITE(PIPEA_DP_LINK_M, m_n.link_m); |
| 541 | I915_WRITE(PIPEA_DP_LINK_N, m_n.link_n); | ||
| 542 | } else { | ||
| 543 | I915_WRITE(PIPEB_GMCH_DATA_M, | ||
| 544 | ((m_n.tu - 1) << PIPE_GMCH_DATA_M_TU_SIZE_SHIFT) | | ||
| 545 | m_n.gmch_m); | ||
| 546 | I915_WRITE(PIPEB_GMCH_DATA_N, | ||
| 547 | m_n.gmch_n); | ||
| 548 | I915_WRITE(PIPEB_DP_LINK_M, m_n.link_m); | ||
| 549 | I915_WRITE(PIPEB_DP_LINK_N, m_n.link_n); | ||
| 550 | } | ||
| 512 | } | 551 | } |
| 513 | } | 552 | } |
| 514 | 553 | ||
| @@ -556,8 +595,38 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
| 556 | 595 | ||
| 557 | if (intel_crtc->pipe == 1) | 596 | if (intel_crtc->pipe == 1) |
| 558 | dp_priv->DP |= DP_PIPEB_SELECT; | 597 | dp_priv->DP |= DP_PIPEB_SELECT; |
| 598 | |||
| 599 | if (IS_eDP(intel_output)) { | ||
| 600 | /* don't miss out required setting for eDP */ | ||
| 601 | dp_priv->DP |= DP_PLL_ENABLE; | ||
| 602 | if (adjusted_mode->clock < 200000) | ||
| 603 | dp_priv->DP |= DP_PLL_FREQ_160MHZ; | ||
| 604 | else | ||
| 605 | dp_priv->DP |= DP_PLL_FREQ_270MHZ; | ||
| 606 | } | ||
| 559 | } | 607 | } |
| 560 | 608 | ||
| 609 | static void igdng_edp_backlight_on (struct drm_device *dev) | ||
| 610 | { | ||
| 611 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 612 | u32 pp; | ||
| 613 | |||
| 614 | DRM_DEBUG("\n"); | ||
| 615 | pp = I915_READ(PCH_PP_CONTROL); | ||
| 616 | pp |= EDP_BLC_ENABLE; | ||
| 617 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
| 618 | } | ||
| 619 | |||
| 620 | static void igdng_edp_backlight_off (struct drm_device *dev) | ||
| 621 | { | ||
| 622 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 623 | u32 pp; | ||
| 624 | |||
| 625 | DRM_DEBUG("\n"); | ||
| 626 | pp = I915_READ(PCH_PP_CONTROL); | ||
| 627 | pp &= ~EDP_BLC_ENABLE; | ||
| 628 | I915_WRITE(PCH_PP_CONTROL, pp); | ||
| 629 | } | ||
| 561 | 630 | ||
| 562 | static void | 631 | static void |
| 563 | intel_dp_dpms(struct drm_encoder *encoder, int mode) | 632 | intel_dp_dpms(struct drm_encoder *encoder, int mode) |
| @@ -569,11 +638,17 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
| 569 | uint32_t dp_reg = I915_READ(dp_priv->output_reg); | 638 | uint32_t dp_reg = I915_READ(dp_priv->output_reg); |
| 570 | 639 | ||
| 571 | if (mode != DRM_MODE_DPMS_ON) { | 640 | if (mode != DRM_MODE_DPMS_ON) { |
| 572 | if (dp_reg & DP_PORT_EN) | 641 | if (dp_reg & DP_PORT_EN) { |
| 573 | intel_dp_link_down(intel_output, dp_priv->DP); | 642 | intel_dp_link_down(intel_output, dp_priv->DP); |
| 643 | if (IS_eDP(intel_output)) | ||
| 644 | igdng_edp_backlight_off(dev); | ||
| 645 | } | ||
| 574 | } else { | 646 | } else { |
| 575 | if (!(dp_reg & DP_PORT_EN)) | 647 | if (!(dp_reg & DP_PORT_EN)) { |
| 576 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); | 648 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); |
| 649 | if (IS_eDP(intel_output)) | ||
| 650 | igdng_edp_backlight_on(dev); | ||
| 651 | } | ||
| 577 | } | 652 | } |
| 578 | dp_priv->dpms_mode = mode; | 653 | dp_priv->dpms_mode = mode; |
| 579 | } | 654 | } |
| @@ -935,6 +1010,23 @@ intel_dp_link_down(struct intel_output *intel_output, uint32_t DP) | |||
| 935 | struct drm_i915_private *dev_priv = dev->dev_private; | 1010 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 936 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | 1011 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; |
| 937 | 1012 | ||
| 1013 | DRM_DEBUG("\n"); | ||
| 1014 | |||
| 1015 | if (IS_eDP(intel_output)) { | ||
| 1016 | DP &= ~DP_PLL_ENABLE; | ||
| 1017 | I915_WRITE(dp_priv->output_reg, DP); | ||
| 1018 | POSTING_READ(dp_priv->output_reg); | ||
| 1019 | udelay(100); | ||
| 1020 | } | ||
| 1021 | |||
| 1022 | DP &= ~DP_LINK_TRAIN_MASK; | ||
| 1023 | I915_WRITE(dp_priv->output_reg, DP | DP_LINK_TRAIN_PAT_IDLE); | ||
| 1024 | POSTING_READ(dp_priv->output_reg); | ||
| 1025 | |||
| 1026 | udelay(17000); | ||
| 1027 | |||
| 1028 | if (IS_eDP(intel_output)) | ||
| 1029 | DP |= DP_LINK_TRAIN_OFF; | ||
| 938 | I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN); | 1030 | I915_WRITE(dp_priv->output_reg, DP & ~DP_PORT_EN); |
| 939 | POSTING_READ(dp_priv->output_reg); | 1031 | POSTING_READ(dp_priv->output_reg); |
| 940 | } | 1032 | } |
| @@ -978,6 +1070,24 @@ intel_dp_check_link_status(struct intel_output *intel_output) | |||
| 978 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); | 1070 | intel_dp_link_train(intel_output, dp_priv->DP, dp_priv->link_configuration); |
| 979 | } | 1071 | } |
| 980 | 1072 | ||
| 1073 | static enum drm_connector_status | ||
| 1074 | igdng_dp_detect(struct drm_connector *connector) | ||
| 1075 | { | ||
| 1076 | struct intel_output *intel_output = to_intel_output(connector); | ||
| 1077 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | ||
| 1078 | enum drm_connector_status status; | ||
| 1079 | |||
| 1080 | status = connector_status_disconnected; | ||
| 1081 | if (intel_dp_aux_native_read(intel_output, | ||
| 1082 | 0x000, dp_priv->dpcd, | ||
| 1083 | sizeof (dp_priv->dpcd)) == sizeof (dp_priv->dpcd)) | ||
| 1084 | { | ||
| 1085 | if (dp_priv->dpcd[0] != 0) | ||
| 1086 | status = connector_status_connected; | ||
| 1087 | } | ||
| 1088 | return status; | ||
| 1089 | } | ||
| 1090 | |||
| 981 | /** | 1091 | /** |
| 982 | * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. | 1092 | * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect DP connection. |
| 983 | * | 1093 | * |
| @@ -996,6 +1106,9 @@ intel_dp_detect(struct drm_connector *connector) | |||
| 996 | 1106 | ||
| 997 | dp_priv->has_audio = false; | 1107 | dp_priv->has_audio = false; |
| 998 | 1108 | ||
| 1109 | if (IS_IGDNG(dev)) | ||
| 1110 | return igdng_dp_detect(connector); | ||
| 1111 | |||
| 999 | temp = I915_READ(PORT_HOTPLUG_EN); | 1112 | temp = I915_READ(PORT_HOTPLUG_EN); |
| 1000 | 1113 | ||
| 1001 | I915_WRITE(PORT_HOTPLUG_EN, | 1114 | I915_WRITE(PORT_HOTPLUG_EN, |
| @@ -1039,11 +1152,27 @@ intel_dp_detect(struct drm_connector *connector) | |||
| 1039 | static int intel_dp_get_modes(struct drm_connector *connector) | 1152 | static int intel_dp_get_modes(struct drm_connector *connector) |
| 1040 | { | 1153 | { |
| 1041 | struct intel_output *intel_output = to_intel_output(connector); | 1154 | struct intel_output *intel_output = to_intel_output(connector); |
| 1155 | struct drm_device *dev = intel_output->base.dev; | ||
| 1156 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
| 1157 | int ret; | ||
| 1042 | 1158 | ||
| 1043 | /* We should parse the EDID data and find out if it has an audio sink | 1159 | /* We should parse the EDID data and find out if it has an audio sink |
| 1044 | */ | 1160 | */ |
| 1045 | 1161 | ||
| 1046 | return intel_ddc_get_modes(intel_output); | 1162 | ret = intel_ddc_get_modes(intel_output); |
| 1163 | if (ret) | ||
| 1164 | return ret; | ||
| 1165 | |||
| 1166 | /* if eDP has no EDID, try to use fixed panel mode from VBT */ | ||
| 1167 | if (IS_eDP(intel_output)) { | ||
| 1168 | if (dev_priv->panel_fixed_mode != NULL) { | ||
| 1169 | struct drm_display_mode *mode; | ||
| 1170 | mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode); | ||
| 1171 | drm_mode_probed_add(connector, mode); | ||
| 1172 | return 1; | ||
| 1173 | } | ||
| 1174 | } | ||
| 1175 | return 0; | ||
| 1047 | } | 1176 | } |
| 1048 | 1177 | ||
| 1049 | static void | 1178 | static void |
| @@ -1106,6 +1235,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1106 | struct drm_connector *connector; | 1235 | struct drm_connector *connector; |
| 1107 | struct intel_output *intel_output; | 1236 | struct intel_output *intel_output; |
| 1108 | struct intel_dp_priv *dp_priv; | 1237 | struct intel_dp_priv *dp_priv; |
| 1238 | const char *name = NULL; | ||
| 1109 | 1239 | ||
| 1110 | intel_output = kcalloc(sizeof(struct intel_output) + | 1240 | intel_output = kcalloc(sizeof(struct intel_output) + |
| 1111 | sizeof(struct intel_dp_priv), 1, GFP_KERNEL); | 1241 | sizeof(struct intel_dp_priv), 1, GFP_KERNEL); |
| @@ -1119,7 +1249,10 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1119 | DRM_MODE_CONNECTOR_DisplayPort); | 1249 | DRM_MODE_CONNECTOR_DisplayPort); |
| 1120 | drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); | 1250 | drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); |
| 1121 | 1251 | ||
| 1122 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | 1252 | if (output_reg == DP_A) |
| 1253 | intel_output->type = INTEL_OUTPUT_EDP; | ||
| 1254 | else | ||
| 1255 | intel_output->type = INTEL_OUTPUT_DISPLAYPORT; | ||
| 1123 | 1256 | ||
| 1124 | connector->interlace_allowed = true; | 1257 | connector->interlace_allowed = true; |
| 1125 | connector->doublescan_allowed = 0; | 1258 | connector->doublescan_allowed = 0; |
| @@ -1139,12 +1272,41 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 1139 | drm_sysfs_connector_add(connector); | 1272 | drm_sysfs_connector_add(connector); |
| 1140 | 1273 | ||
| 1141 | /* Set up the DDC bus. */ | 1274 | /* Set up the DDC bus. */ |
| 1142 | intel_dp_i2c_init(intel_output, | 1275 | switch (output_reg) { |
| 1143 | (output_reg == DP_B) ? "DPDDC-B" : | 1276 | case DP_A: |
| 1144 | (output_reg == DP_C) ? "DPDDC-C" : "DPDDC-D"); | 1277 | name = "DPDDC-A"; |
| 1278 | break; | ||
| 1279 | case DP_B: | ||
| 1280 | case PCH_DP_B: | ||
| 1281 | name = "DPDDC-B"; | ||
| 1282 | break; | ||
| 1283 | case DP_C: | ||
| 1284 | case PCH_DP_C: | ||
| 1285 | name = "DPDDC-C"; | ||
| 1286 | break; | ||
| 1287 | case DP_D: | ||
| 1288 | case PCH_DP_D: | ||
| 1289 | name = "DPDDC-D"; | ||
| 1290 | break; | ||
| 1291 | } | ||
| 1292 | |||
| 1293 | intel_dp_i2c_init(intel_output, name); | ||
| 1294 | |||
| 1145 | intel_output->ddc_bus = &dp_priv->adapter; | 1295 | intel_output->ddc_bus = &dp_priv->adapter; |
| 1146 | intel_output->hot_plug = intel_dp_hot_plug; | 1296 | intel_output->hot_plug = intel_dp_hot_plug; |
| 1147 | 1297 | ||
| 1298 | if (output_reg == DP_A) { | ||
| 1299 | /* initialize panel mode from VBT if available for eDP */ | ||
| 1300 | if (dev_priv->lfp_lvds_vbt_mode) { | ||
| 1301 | dev_priv->panel_fixed_mode = | ||
| 1302 | drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode); | ||
| 1303 | if (dev_priv->panel_fixed_mode) { | ||
| 1304 | dev_priv->panel_fixed_mode->type |= | ||
| 1305 | DRM_MODE_TYPE_PREFERRED; | ||
| 1306 | } | ||
| 1307 | } | ||
| 1308 | } | ||
| 1309 | |||
| 1148 | /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written | 1310 | /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written |
| 1149 | * 0xd. Failure to do so will result in spurious interrupts being | 1311 | * 0xd. Failure to do so will result in spurious interrupts being |
| 1150 | * generated on the port when a cable is not attached. | 1312 | * generated on the port when a cable is not attached. |
