diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_panel.c | 136 |
1 files changed, 86 insertions, 50 deletions
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 41b3be217493..4d63839bd9b4 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -521,6 +521,9 @@ static u32 _vlv_get_backlight(struct drm_device *dev, enum pipe pipe) | |||
521 | { | 521 | { |
522 | struct drm_i915_private *dev_priv = dev->dev_private; | 522 | struct drm_i915_private *dev_priv = dev->dev_private; |
523 | 523 | ||
524 | if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) | ||
525 | return 0; | ||
526 | |||
524 | return I915_READ(VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK; | 527 | return I915_READ(VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK; |
525 | } | 528 | } |
526 | 529 | ||
@@ -536,15 +539,17 @@ static u32 intel_panel_get_backlight(struct intel_connector *connector) | |||
536 | { | 539 | { |
537 | struct drm_device *dev = connector->base.dev; | 540 | struct drm_device *dev = connector->base.dev; |
538 | struct drm_i915_private *dev_priv = dev->dev_private; | 541 | struct drm_i915_private *dev_priv = dev->dev_private; |
539 | u32 val; | 542 | struct intel_panel *panel = &connector->panel; |
540 | unsigned long flags; | 543 | u32 val = 0; |
541 | 544 | ||
542 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 545 | mutex_lock(&dev_priv->backlight_lock); |
543 | 546 | ||
544 | val = dev_priv->display.get_backlight(connector); | 547 | if (panel->backlight.enabled) { |
545 | val = intel_panel_compute_brightness(connector, val); | 548 | val = dev_priv->display.get_backlight(connector); |
549 | val = intel_panel_compute_brightness(connector, val); | ||
550 | } | ||
546 | 551 | ||
547 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 552 | mutex_unlock(&dev_priv->backlight_lock); |
548 | 553 | ||
549 | DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); | 554 | DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); |
550 | return val; | 555 | return val; |
@@ -603,6 +608,9 @@ static void vlv_set_backlight(struct intel_connector *connector, u32 level) | |||
603 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 608 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
604 | u32 tmp; | 609 | u32 tmp; |
605 | 610 | ||
611 | if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) | ||
612 | return; | ||
613 | |||
606 | tmp = I915_READ(VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK; | 614 | tmp = I915_READ(VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK; |
607 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level); | 615 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), tmp | level); |
608 | } | 616 | } |
@@ -626,14 +634,12 @@ static void intel_panel_set_backlight(struct intel_connector *connector, | |||
626 | struct drm_device *dev = connector->base.dev; | 634 | struct drm_device *dev = connector->base.dev; |
627 | struct drm_i915_private *dev_priv = dev->dev_private; | 635 | struct drm_i915_private *dev_priv = dev->dev_private; |
628 | struct intel_panel *panel = &connector->panel; | 636 | struct intel_panel *panel = &connector->panel; |
629 | enum pipe pipe = intel_get_pipe_from_connector(connector); | ||
630 | u32 hw_level; | 637 | u32 hw_level; |
631 | unsigned long flags; | ||
632 | 638 | ||
633 | if (!panel->backlight.present || pipe == INVALID_PIPE) | 639 | if (!panel->backlight.present) |
634 | return; | 640 | return; |
635 | 641 | ||
636 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 642 | mutex_lock(&dev_priv->backlight_lock); |
637 | 643 | ||
638 | WARN_ON(panel->backlight.max == 0); | 644 | WARN_ON(panel->backlight.max == 0); |
639 | 645 | ||
@@ -643,7 +649,7 @@ static void intel_panel_set_backlight(struct intel_connector *connector, | |||
643 | if (panel->backlight.enabled) | 649 | if (panel->backlight.enabled) |
644 | intel_panel_actually_set_backlight(connector, hw_level); | 650 | intel_panel_actually_set_backlight(connector, hw_level); |
645 | 651 | ||
646 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 652 | mutex_unlock(&dev_priv->backlight_lock); |
647 | } | 653 | } |
648 | 654 | ||
649 | /* set backlight brightness to level in range [0..max], assuming hw min is | 655 | /* set backlight brightness to level in range [0..max], assuming hw min is |
@@ -657,12 +663,17 @@ void intel_panel_set_backlight_acpi(struct intel_connector *connector, | |||
657 | struct intel_panel *panel = &connector->panel; | 663 | struct intel_panel *panel = &connector->panel; |
658 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 664 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
659 | u32 hw_level; | 665 | u32 hw_level; |
660 | unsigned long flags; | ||
661 | 666 | ||
667 | /* | ||
668 | * INVALID_PIPE may occur during driver init because | ||
669 | * connection_mutex isn't held across the entire backlight | ||
670 | * setup + modeset readout, and the BIOS can issue the | ||
671 | * requests at any time. | ||
672 | */ | ||
662 | if (!panel->backlight.present || pipe == INVALID_PIPE) | 673 | if (!panel->backlight.present || pipe == INVALID_PIPE) |
663 | return; | 674 | return; |
664 | 675 | ||
665 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 676 | mutex_lock(&dev_priv->backlight_lock); |
666 | 677 | ||
667 | WARN_ON(panel->backlight.max == 0); | 678 | WARN_ON(panel->backlight.max == 0); |
668 | 679 | ||
@@ -678,7 +689,7 @@ void intel_panel_set_backlight_acpi(struct intel_connector *connector, | |||
678 | if (panel->backlight.enabled) | 689 | if (panel->backlight.enabled) |
679 | intel_panel_actually_set_backlight(connector, hw_level); | 690 | intel_panel_actually_set_backlight(connector, hw_level); |
680 | 691 | ||
681 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 692 | mutex_unlock(&dev_priv->backlight_lock); |
682 | } | 693 | } |
683 | 694 | ||
684 | static void pch_disable_backlight(struct intel_connector *connector) | 695 | static void pch_disable_backlight(struct intel_connector *connector) |
@@ -720,6 +731,9 @@ static void vlv_disable_backlight(struct intel_connector *connector) | |||
720 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 731 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
721 | u32 tmp; | 732 | u32 tmp; |
722 | 733 | ||
734 | if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) | ||
735 | return; | ||
736 | |||
723 | intel_panel_actually_set_backlight(connector, 0); | 737 | intel_panel_actually_set_backlight(connector, 0); |
724 | 738 | ||
725 | tmp = I915_READ(VLV_BLC_PWM_CTL2(pipe)); | 739 | tmp = I915_READ(VLV_BLC_PWM_CTL2(pipe)); |
@@ -731,10 +745,8 @@ void intel_panel_disable_backlight(struct intel_connector *connector) | |||
731 | struct drm_device *dev = connector->base.dev; | 745 | struct drm_device *dev = connector->base.dev; |
732 | struct drm_i915_private *dev_priv = dev->dev_private; | 746 | struct drm_i915_private *dev_priv = dev->dev_private; |
733 | struct intel_panel *panel = &connector->panel; | 747 | struct intel_panel *panel = &connector->panel; |
734 | enum pipe pipe = intel_get_pipe_from_connector(connector); | ||
735 | unsigned long flags; | ||
736 | 748 | ||
737 | if (!panel->backlight.present || pipe == INVALID_PIPE) | 749 | if (!panel->backlight.present) |
738 | return; | 750 | return; |
739 | 751 | ||
740 | /* | 752 | /* |
@@ -748,14 +760,14 @@ void intel_panel_disable_backlight(struct intel_connector *connector) | |||
748 | return; | 760 | return; |
749 | } | 761 | } |
750 | 762 | ||
751 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 763 | mutex_lock(&dev_priv->backlight_lock); |
752 | 764 | ||
753 | if (panel->backlight.device) | 765 | if (panel->backlight.device) |
754 | panel->backlight.device->props.power = FB_BLANK_POWERDOWN; | 766 | panel->backlight.device->props.power = FB_BLANK_POWERDOWN; |
755 | panel->backlight.enabled = false; | 767 | panel->backlight.enabled = false; |
756 | dev_priv->display.disable_backlight(connector); | 768 | dev_priv->display.disable_backlight(connector); |
757 | 769 | ||
758 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 770 | mutex_unlock(&dev_priv->backlight_lock); |
759 | } | 771 | } |
760 | 772 | ||
761 | static void bdw_enable_backlight(struct intel_connector *connector) | 773 | static void bdw_enable_backlight(struct intel_connector *connector) |
@@ -779,8 +791,9 @@ static void bdw_enable_backlight(struct intel_connector *connector) | |||
779 | if (panel->backlight.active_low_pwm) | 791 | if (panel->backlight.active_low_pwm) |
780 | pch_ctl1 |= BLM_PCH_POLARITY; | 792 | pch_ctl1 |= BLM_PCH_POLARITY; |
781 | 793 | ||
782 | /* BDW always uses the pch pwm controls. */ | 794 | /* After LPT, override is the default. */ |
783 | pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE; | 795 | if (HAS_PCH_LPT(dev_priv)) |
796 | pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE; | ||
784 | 797 | ||
785 | I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1); | 798 | I915_WRITE(BLC_PWM_PCH_CTL1, pch_ctl1); |
786 | POSTING_READ(BLC_PWM_PCH_CTL1); | 799 | POSTING_READ(BLC_PWM_PCH_CTL1); |
@@ -909,6 +922,9 @@ static void vlv_enable_backlight(struct intel_connector *connector) | |||
909 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 922 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
910 | u32 ctl, ctl2; | 923 | u32 ctl, ctl2; |
911 | 924 | ||
925 | if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) | ||
926 | return; | ||
927 | |||
912 | ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe)); | 928 | ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe)); |
913 | if (ctl2 & BLM_PWM_ENABLE) { | 929 | if (ctl2 & BLM_PWM_ENABLE) { |
914 | DRM_DEBUG_KMS("backlight already enabled\n"); | 930 | DRM_DEBUG_KMS("backlight already enabled\n"); |
@@ -936,14 +952,13 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | |||
936 | struct drm_i915_private *dev_priv = dev->dev_private; | 952 | struct drm_i915_private *dev_priv = dev->dev_private; |
937 | struct intel_panel *panel = &connector->panel; | 953 | struct intel_panel *panel = &connector->panel; |
938 | enum pipe pipe = intel_get_pipe_from_connector(connector); | 954 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
939 | unsigned long flags; | ||
940 | 955 | ||
941 | if (!panel->backlight.present || pipe == INVALID_PIPE) | 956 | if (!panel->backlight.present) |
942 | return; | 957 | return; |
943 | 958 | ||
944 | DRM_DEBUG_KMS("pipe %c\n", pipe_name(pipe)); | 959 | DRM_DEBUG_KMS("pipe %c\n", pipe_name(pipe)); |
945 | 960 | ||
946 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 961 | mutex_lock(&dev_priv->backlight_lock); |
947 | 962 | ||
948 | WARN_ON(panel->backlight.max == 0); | 963 | WARN_ON(panel->backlight.max == 0); |
949 | 964 | ||
@@ -961,7 +976,7 @@ void intel_panel_enable_backlight(struct intel_connector *connector) | |||
961 | if (panel->backlight.device) | 976 | if (panel->backlight.device) |
962 | panel->backlight.device->props.power = FB_BLANK_UNBLANK; | 977 | panel->backlight.device->props.power = FB_BLANK_UNBLANK; |
963 | 978 | ||
964 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 979 | mutex_unlock(&dev_priv->backlight_lock); |
965 | } | 980 | } |
966 | 981 | ||
967 | #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) | 982 | #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) |
@@ -1030,6 +1045,9 @@ static int intel_backlight_device_register(struct intel_connector *connector) | |||
1030 | if (WARN_ON(panel->backlight.device)) | 1045 | if (WARN_ON(panel->backlight.device)) |
1031 | return -ENODEV; | 1046 | return -ENODEV; |
1032 | 1047 | ||
1048 | if (!panel->backlight.present) | ||
1049 | return 0; | ||
1050 | |||
1033 | WARN_ON(panel->backlight.max == 0); | 1051 | WARN_ON(panel->backlight.max == 0); |
1034 | 1052 | ||
1035 | memset(&props, 0, sizeof(props)); | 1053 | memset(&props, 0, sizeof(props)); |
@@ -1065,6 +1083,10 @@ static int intel_backlight_device_register(struct intel_connector *connector) | |||
1065 | panel->backlight.device = NULL; | 1083 | panel->backlight.device = NULL; |
1066 | return -ENODEV; | 1084 | return -ENODEV; |
1067 | } | 1085 | } |
1086 | |||
1087 | DRM_DEBUG_KMS("Connector %s backlight sysfs interface registered\n", | ||
1088 | connector->base.name); | ||
1089 | |||
1068 | return 0; | 1090 | return 0; |
1069 | } | 1091 | } |
1070 | 1092 | ||
@@ -1119,7 +1141,7 @@ static u32 get_backlight_min_vbt(struct intel_connector *connector) | |||
1119 | return scale(min, 0, 255, 0, panel->backlight.max); | 1141 | return scale(min, 0, 255, 0, panel->backlight.max); |
1120 | } | 1142 | } |
1121 | 1143 | ||
1122 | static int bdw_setup_backlight(struct intel_connector *connector) | 1144 | static int bdw_setup_backlight(struct intel_connector *connector, enum pipe unused) |
1123 | { | 1145 | { |
1124 | struct drm_device *dev = connector->base.dev; | 1146 | struct drm_device *dev = connector->base.dev; |
1125 | struct drm_i915_private *dev_priv = dev->dev_private; | 1147 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1145,7 +1167,7 @@ static int bdw_setup_backlight(struct intel_connector *connector) | |||
1145 | return 0; | 1167 | return 0; |
1146 | } | 1168 | } |
1147 | 1169 | ||
1148 | static int pch_setup_backlight(struct intel_connector *connector) | 1170 | static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused) |
1149 | { | 1171 | { |
1150 | struct drm_device *dev = connector->base.dev; | 1172 | struct drm_device *dev = connector->base.dev; |
1151 | struct drm_i915_private *dev_priv = dev->dev_private; | 1173 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1172,7 +1194,7 @@ static int pch_setup_backlight(struct intel_connector *connector) | |||
1172 | return 0; | 1194 | return 0; |
1173 | } | 1195 | } |
1174 | 1196 | ||
1175 | static int i9xx_setup_backlight(struct intel_connector *connector) | 1197 | static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused) |
1176 | { | 1198 | { |
1177 | struct drm_device *dev = connector->base.dev; | 1199 | struct drm_device *dev = connector->base.dev; |
1178 | struct drm_i915_private *dev_priv = dev->dev_private; | 1200 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1204,7 +1226,7 @@ static int i9xx_setup_backlight(struct intel_connector *connector) | |||
1204 | return 0; | 1226 | return 0; |
1205 | } | 1227 | } |
1206 | 1228 | ||
1207 | static int i965_setup_backlight(struct intel_connector *connector) | 1229 | static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused) |
1208 | { | 1230 | { |
1209 | struct drm_device *dev = connector->base.dev; | 1231 | struct drm_device *dev = connector->base.dev; |
1210 | struct drm_i915_private *dev_priv = dev->dev_private; | 1232 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -1234,37 +1256,40 @@ static int i965_setup_backlight(struct intel_connector *connector) | |||
1234 | return 0; | 1256 | return 0; |
1235 | } | 1257 | } |
1236 | 1258 | ||
1237 | static int vlv_setup_backlight(struct intel_connector *connector) | 1259 | static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe) |
1238 | { | 1260 | { |
1239 | struct drm_device *dev = connector->base.dev; | 1261 | struct drm_device *dev = connector->base.dev; |
1240 | struct drm_i915_private *dev_priv = dev->dev_private; | 1262 | struct drm_i915_private *dev_priv = dev->dev_private; |
1241 | struct intel_panel *panel = &connector->panel; | 1263 | struct intel_panel *panel = &connector->panel; |
1242 | enum pipe pipe; | 1264 | enum pipe p; |
1243 | u32 ctl, ctl2, val; | 1265 | u32 ctl, ctl2, val; |
1244 | 1266 | ||
1245 | for_each_pipe(dev_priv, pipe) { | 1267 | for_each_pipe(dev_priv, p) { |
1246 | u32 cur_val = I915_READ(VLV_BLC_PWM_CTL(pipe)); | 1268 | u32 cur_val = I915_READ(VLV_BLC_PWM_CTL(p)); |
1247 | 1269 | ||
1248 | /* Skip if the modulation freq is already set */ | 1270 | /* Skip if the modulation freq is already set */ |
1249 | if (cur_val & ~BACKLIGHT_DUTY_CYCLE_MASK) | 1271 | if (cur_val & ~BACKLIGHT_DUTY_CYCLE_MASK) |
1250 | continue; | 1272 | continue; |
1251 | 1273 | ||
1252 | cur_val &= BACKLIGHT_DUTY_CYCLE_MASK; | 1274 | cur_val &= BACKLIGHT_DUTY_CYCLE_MASK; |
1253 | I915_WRITE(VLV_BLC_PWM_CTL(pipe), (0xf42 << 16) | | 1275 | I915_WRITE(VLV_BLC_PWM_CTL(p), (0xf42 << 16) | |
1254 | cur_val); | 1276 | cur_val); |
1255 | } | 1277 | } |
1256 | 1278 | ||
1257 | ctl2 = I915_READ(VLV_BLC_PWM_CTL2(PIPE_A)); | 1279 | if (WARN_ON(pipe != PIPE_A && pipe != PIPE_B)) |
1280 | return -ENODEV; | ||
1281 | |||
1282 | ctl2 = I915_READ(VLV_BLC_PWM_CTL2(pipe)); | ||
1258 | panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; | 1283 | panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965; |
1259 | 1284 | ||
1260 | ctl = I915_READ(VLV_BLC_PWM_CTL(PIPE_A)); | 1285 | ctl = I915_READ(VLV_BLC_PWM_CTL(pipe)); |
1261 | panel->backlight.max = ctl >> 16; | 1286 | panel->backlight.max = ctl >> 16; |
1262 | if (!panel->backlight.max) | 1287 | if (!panel->backlight.max) |
1263 | return -ENODEV; | 1288 | return -ENODEV; |
1264 | 1289 | ||
1265 | panel->backlight.min = get_backlight_min_vbt(connector); | 1290 | panel->backlight.min = get_backlight_min_vbt(connector); |
1266 | 1291 | ||
1267 | val = _vlv_get_backlight(dev, PIPE_A); | 1292 | val = _vlv_get_backlight(dev, pipe); |
1268 | panel->backlight.level = intel_panel_compute_brightness(connector, val); | 1293 | panel->backlight.level = intel_panel_compute_brightness(connector, val); |
1269 | 1294 | ||
1270 | panel->backlight.enabled = (ctl2 & BLM_PWM_ENABLE) && | 1295 | panel->backlight.enabled = (ctl2 & BLM_PWM_ENABLE) && |
@@ -1273,13 +1298,12 @@ static int vlv_setup_backlight(struct intel_connector *connector) | |||
1273 | return 0; | 1298 | return 0; |
1274 | } | 1299 | } |
1275 | 1300 | ||
1276 | int intel_panel_setup_backlight(struct drm_connector *connector) | 1301 | int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe) |
1277 | { | 1302 | { |
1278 | struct drm_device *dev = connector->dev; | 1303 | struct drm_device *dev = connector->dev; |
1279 | struct drm_i915_private *dev_priv = dev->dev_private; | 1304 | struct drm_i915_private *dev_priv = dev->dev_private; |
1280 | struct intel_connector *intel_connector = to_intel_connector(connector); | 1305 | struct intel_connector *intel_connector = to_intel_connector(connector); |
1281 | struct intel_panel *panel = &intel_connector->panel; | 1306 | struct intel_panel *panel = &intel_connector->panel; |
1282 | unsigned long flags; | ||
1283 | int ret; | 1307 | int ret; |
1284 | 1308 | ||
1285 | if (!dev_priv->vbt.backlight.present) { | 1309 | if (!dev_priv->vbt.backlight.present) { |
@@ -1292,9 +1316,9 @@ int intel_panel_setup_backlight(struct drm_connector *connector) | |||
1292 | } | 1316 | } |
1293 | 1317 | ||
1294 | /* set level and max in panel struct */ | 1318 | /* set level and max in panel struct */ |
1295 | spin_lock_irqsave(&dev_priv->backlight_lock, flags); | 1319 | mutex_lock(&dev_priv->backlight_lock); |
1296 | ret = dev_priv->display.setup_backlight(intel_connector); | 1320 | ret = dev_priv->display.setup_backlight(intel_connector, pipe); |
1297 | spin_unlock_irqrestore(&dev_priv->backlight_lock, flags); | 1321 | mutex_unlock(&dev_priv->backlight_lock); |
1298 | 1322 | ||
1299 | if (ret) { | 1323 | if (ret) { |
1300 | DRM_DEBUG_KMS("failed to setup backlight for connector %s\n", | 1324 | DRM_DEBUG_KMS("failed to setup backlight for connector %s\n", |
@@ -1302,15 +1326,12 @@ int intel_panel_setup_backlight(struct drm_connector *connector) | |||
1302 | return ret; | 1326 | return ret; |
1303 | } | 1327 | } |
1304 | 1328 | ||
1305 | intel_backlight_device_register(intel_connector); | ||
1306 | |||
1307 | panel->backlight.present = true; | 1329 | panel->backlight.present = true; |
1308 | 1330 | ||
1309 | DRM_DEBUG_KMS("backlight initialized, %s, brightness %u/%u, " | 1331 | DRM_DEBUG_KMS("Connector %s backlight initialized, %s, brightness %u/%u\n", |
1310 | "sysfs interface %sregistered\n", | 1332 | connector->name, |
1311 | panel->backlight.enabled ? "enabled" : "disabled", | 1333 | panel->backlight.enabled ? "enabled" : "disabled", |
1312 | panel->backlight.level, panel->backlight.max, | 1334 | panel->backlight.level, panel->backlight.max); |
1313 | panel->backlight.device ? "" : "not "); | ||
1314 | 1335 | ||
1315 | return 0; | 1336 | return 0; |
1316 | } | 1337 | } |
@@ -1321,7 +1342,6 @@ void intel_panel_destroy_backlight(struct drm_connector *connector) | |||
1321 | struct intel_panel *panel = &intel_connector->panel; | 1342 | struct intel_panel *panel = &intel_connector->panel; |
1322 | 1343 | ||
1323 | panel->backlight.present = false; | 1344 | panel->backlight.present = false; |
1324 | intel_backlight_device_unregister(intel_connector); | ||
1325 | } | 1345 | } |
1326 | 1346 | ||
1327 | /* Set up chip specific backlight functions */ | 1347 | /* Set up chip specific backlight functions */ |
@@ -1329,7 +1349,7 @@ void intel_panel_init_backlight_funcs(struct drm_device *dev) | |||
1329 | { | 1349 | { |
1330 | struct drm_i915_private *dev_priv = dev->dev_private; | 1350 | struct drm_i915_private *dev_priv = dev->dev_private; |
1331 | 1351 | ||
1332 | if (IS_BROADWELL(dev)) { | 1352 | if (IS_BROADWELL(dev) || (INTEL_INFO(dev)->gen >= 9)) { |
1333 | dev_priv->display.setup_backlight = bdw_setup_backlight; | 1353 | dev_priv->display.setup_backlight = bdw_setup_backlight; |
1334 | dev_priv->display.enable_backlight = bdw_enable_backlight; | 1354 | dev_priv->display.enable_backlight = bdw_enable_backlight; |
1335 | dev_priv->display.disable_backlight = pch_disable_backlight; | 1355 | dev_priv->display.disable_backlight = pch_disable_backlight; |
@@ -1384,3 +1404,19 @@ void intel_panel_fini(struct intel_panel *panel) | |||
1384 | drm_mode_destroy(intel_connector->base.dev, | 1404 | drm_mode_destroy(intel_connector->base.dev, |
1385 | panel->downclock_mode); | 1405 | panel->downclock_mode); |
1386 | } | 1406 | } |
1407 | |||
1408 | void intel_backlight_register(struct drm_device *dev) | ||
1409 | { | ||
1410 | struct intel_connector *connector; | ||
1411 | |||
1412 | list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) | ||
1413 | intel_backlight_device_register(connector); | ||
1414 | } | ||
1415 | |||
1416 | void intel_backlight_unregister(struct drm_device *dev) | ||
1417 | { | ||
1418 | struct intel_connector *connector; | ||
1419 | |||
1420 | list_for_each_entry(connector, &dev->mode_config.connector_list, base.head) | ||
1421 | intel_backlight_device_unregister(connector); | ||
1422 | } | ||