@@ -1431,6 +1431,30 @@ bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1431
1431
return 0 ;
1432
1432
}
1433
1433
1434
+ static int cnp_num_backlight_controllers (struct drm_i915_private * i915 )
1435
+ {
1436
+ if (INTEL_PCH_TYPE (i915 ) >= PCH_DG1 )
1437
+ return 1 ;
1438
+
1439
+ if (INTEL_PCH_TYPE (i915 ) >= PCH_ICP )
1440
+ return 2 ;
1441
+
1442
+ return 1 ;
1443
+ }
1444
+
1445
+ static bool cnp_backlight_controller_is_valid (struct drm_i915_private * i915 , int controller )
1446
+ {
1447
+ if (controller < 0 || controller >= cnp_num_backlight_controllers (i915 ))
1448
+ return false;
1449
+
1450
+ if (controller == 1 &&
1451
+ INTEL_PCH_TYPE (i915 ) >= PCH_ICP &&
1452
+ INTEL_PCH_TYPE (i915 ) < PCH_MTP )
1453
+ return intel_de_read (i915 , SOUTH_CHICKEN1 ) & ICP_SECOND_PPS_IO_SELECT ;
1454
+
1455
+ return true;
1456
+ }
1457
+
1434
1458
static int
1435
1459
cnp_setup_backlight (struct intel_connector * connector , enum pipe unused )
1436
1460
{
@@ -1440,10 +1464,14 @@ cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
1440
1464
1441
1465
/*
1442
1466
* CNP has the BXT implementation of backlight, but with only one
1443
- * controller. TODO: ICP has multiple controllers but we only use
1444
- * controller 0 for now.
1467
+ * controller. ICP+ can have two controllers, depending on pin muxing.
1445
1468
*/
1446
- panel -> backlight .controller = 0 ;
1469
+ panel -> backlight .controller = connector -> panel .vbt .backlight .controller ;
1470
+ if (!cnp_backlight_controller_is_valid (i915 , panel -> backlight .controller )) {
1471
+ drm_dbg_kms (& i915 -> drm , "Invalid backlight controller %d, assuming 0\n" ,
1472
+ panel -> backlight .controller );
1473
+ panel -> backlight .controller = 0 ;
1474
+ }
1447
1475
1448
1476
pwm_ctl = intel_de_read (i915 ,
1449
1477
BXT_BLC_PWM_CTL (panel -> backlight .controller ));
0 commit comments