drm/i915: Parsing LFP brightness control from VBT
authorDeepak M <m.deepak@intel.com>
Mon, 15 Dec 2014 10:28:21 +0000 (15:58 +0530)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 15 Dec 2014 10:25:29 +0000 (11:25 +0100)
LFP brighness control from the VBT block 43 indicates which
controller is used for brightness.
LFP1 brightness control method:
Bit 7-4 = This field controller number of the brightnes controller.
0 = Controller 0
1 = Controller 1
2 = Controller 2
3 = Controller 3
Others = Reserved
Bits 3-0 = This field specifies the brightness control pin to be used on the
platform.
0 = PMIC pin is used for brightness control
1 = LPSS PWM is used for brightness control
2 = Display DDI is used for brightness control
3 = CABC method to control brightness
Others = Reserved

Adding the above fields in dev_priv->vbt and corresponding changes in
parse_backlight()

v2: Jani's review comments addressed
- Move PWM definitions to intel_bios.h
- Moving vbt_version to intel_vbt_data
- Rename brightness to bl_ctrl_data
- Logging just control_pin instead of string
- Avoid adding vbt_version in dev_priv
- Since only DDI option is available as of now, let control pin DDI
affect dev_priv->vbt.backlight.present

v3: Jani's review comments addressed
- Drop control_pin
- Use bdb->version
- set controller to 0 instead of using control pin define
- check controller bounds
- remove superfluous changes in intel_parse_bios

Signed-off-by: Deepak M <m.deepak@intel.com>
Signed-off-by: Vandana Kannan <vandana.kannan@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_bios.h

index eb47990f827c41477a5218b339b66e0571e40b04..104c288f1e6809c09faf872b4182ac53352bb646 100644 (file)
@@ -1367,6 +1367,7 @@ struct intel_vbt_data {
                bool present;
                bool active_low_pwm;
                u8 min_brightness;      /* min_brightness/255 of max */
+               u8 controller;          /* brightness controller number */
        } backlight;
 
        /* MIPI DSI */
index 3f178258d9f9ce679044d2775b66359297d68623..65b1fbc5eb57a788ee19833a7582b40de18fab13 100644 (file)
@@ -314,6 +314,7 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
 {
        const struct bdb_lfp_backlight_data *backlight_data;
        const struct bdb_lfp_backlight_data_entry *entry;
+       const struct bdb_lfp_backlight_control_data *bl_ctrl_data;
 
        backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT);
        if (!backlight_data)
@@ -326,6 +327,7 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
        }
 
        entry = &backlight_data->data[panel_type];
+       bl_ctrl_data = &backlight_data->blc_ctl[panel_type];
 
        dev_priv->vbt.backlight.present = entry->type == BDB_BACKLIGHT_TYPE_PWM;
        if (!dev_priv->vbt.backlight.present) {
@@ -337,12 +339,30 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv, struct bdb_header *bdb)
        dev_priv->vbt.backlight.pwm_freq_hz = entry->pwm_freq_hz;
        dev_priv->vbt.backlight.active_low_pwm = entry->active_low_pwm;
        dev_priv->vbt.backlight.min_brightness = entry->min_brightness;
+
+       dev_priv->vbt.backlight.controller = 0;
+       if (bdb->version >= 191) {
+               dev_priv->vbt.backlight.present =
+                               bl_ctrl_data->pin == BLC_CONTROL_PIN_DDI;
+               if (!dev_priv->vbt.backlight.present) {
+                       DRM_DEBUG_KMS("BL control pin is not DDI (pin %u)\n",
+                                       bl_ctrl_data->pin);
+                       return;
+               }
+               if (bl_ctrl_data->controller == 1)
+                       dev_priv->vbt.backlight.controller =
+                               bl_ctrl_data->controller;
+       }
+
        DRM_DEBUG_KMS("VBT backlight PWM modulation frequency %u Hz, "
                      "active %s, min brightness %u, level %u\n",
                      dev_priv->vbt.backlight.pwm_freq_hz,
                      dev_priv->vbt.backlight.active_low_pwm ? "low" : "high",
                      dev_priv->vbt.backlight.min_brightness,
                      backlight_data->level[panel_type]);
+
+       DRM_DEBUG_KMS("VBT BL controller %u\n",
+               dev_priv->vbt.backlight.controller);
 }
 
 /* Try to find sdvo panel data */
index a6a8710f665f5c8b37c28fd3b62ad7d0593a00b4..9a7202e5caf45aedc30165224d1487e66b4e5975 100644 (file)
@@ -402,10 +402,21 @@ struct bdb_lfp_backlight_data_entry {
        u8 obsolete3;
 } __packed;
 
+#define BLC_CONTROL_PIN_PMIC           0
+#define BLC_CONTROL_PIN_LPSS_PWM       1
+#define BLC_CONTROL_PIN_DDI            2
+#define BLC_CONTROL_PIN_CABC           3
+
+struct bdb_lfp_backlight_control_data {
+       u8 controller:4;
+       u8 pin:4;
+} __packed;
+
 struct bdb_lfp_backlight_data {
        u8 entry_size;
        struct bdb_lfp_backlight_data_entry data[16];
        u8 level[16];
+       struct bdb_lfp_backlight_control_data blc_ctl[16];
 } __packed;
 
 struct aimdb_header {