aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_panel.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_panel.c')
-rw-r--r--drivers/gpu/drm/i915/intel_panel.c136
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
684static void pch_disable_backlight(struct intel_connector *connector) 695static 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
761static void bdw_enable_backlight(struct intel_connector *connector) 773static 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
1122static int bdw_setup_backlight(struct intel_connector *connector) 1144static 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
1148static int pch_setup_backlight(struct intel_connector *connector) 1170static 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
1175static int i9xx_setup_backlight(struct intel_connector *connector) 1197static 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
1207static int i965_setup_backlight(struct intel_connector *connector) 1229static 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
1237static int vlv_setup_backlight(struct intel_connector *connector) 1259static 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
1276int intel_panel_setup_backlight(struct drm_connector *connector) 1301int 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
1408void 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
1416void 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}