aboutsummaryrefslogtreecommitdiff
path: root/src/northbridge/intel/gm45
diff options
context:
space:
mode:
Diffstat (limited to 'src/northbridge/intel/gm45')
-rw-r--r--src/northbridge/intel/gm45/gma.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/src/northbridge/intel/gm45/gma.c b/src/northbridge/intel/gm45/gma.c
index b86e2b3e7e..64b6a571ba 100644
--- a/src/northbridge/intel/gm45/gma.c
+++ b/src/northbridge/intel/gm45/gma.c
@@ -668,6 +668,39 @@ static u32 freq_to_blc_pwm_ctl(struct device *const dev,
return (blc_mod << 16) | blc_mod;
}
+static u16 get_blc_pwm_freq_value(const char *edid_ascii_string)
+{
+ static u16 blc_pwm_freq;
+ const struct blc_pwm_t *blc_pwm;
+ int i;
+ int blc_array_len;
+
+ if (blc_pwm_freq > 0)
+ return blc_pwm_freq;
+
+ blc_array_len = get_blc_values(&blc_pwm);
+ /* Find EDID string and pwm freq in lookup table */
+ for (i = 0; i < blc_array_len; i++) {
+ if (!strcmp(blc_pwm[i].ascii_string, edid_ascii_string)) {
+ blc_pwm_freq = blc_pwm[i].pwm_freq;
+ printk(BIOS_DEBUG, "Found EDID string: %s in lookup table, pwm: %dHz\n",
+ blc_pwm[i].ascii_string, blc_pwm_freq);
+ break;
+ }
+ }
+
+ if (i == blc_array_len)
+ printk(BIOS_NOTICE, "Your panels EDID `%s` wasn't found in the"
+ "lookup table.\n You may have issues with your panels"
+ "backlight.\n If you want to help improving coreboot"
+ "please report: this EDID string\n and the result"
+ "of `intel_read read BLC_PWM_CTL`"
+ "(from intel-gpu-tools)\n while running vendor BIOS\n",
+ edid_ascii_string);
+
+ return blc_pwm_freq;
+}
+
static void gma_pm_init_post_vbios(struct device *const dev,
const char *edid_ascii_string)
{
@@ -675,9 +708,7 @@ static void gma_pm_init_post_vbios(struct device *const dev,
u32 reg32;
u8 reg8;
- const struct blc_pwm_t *blc_pwm;
- int blc_array_len, i;
- u16 pwm_freq = 0;
+ u16 pwm_freq;
/* Setup Panel Power On Delays */
reg32 = gtt_read(PP_ON_DELAYS);
@@ -708,30 +739,10 @@ static void gma_pm_init_post_vbios(struct device *const dev,
reg8 = 100;
if (conf->duty_cycle != 0)
reg8 = conf->duty_cycle;
- blc_array_len = get_blc_values(&blc_pwm);
- if (conf->default_pwm_freq != 0)
+ pwm_freq = get_blc_pwm_freq_value(edid_ascii_string);
+ if (pwm_freq == 0 && conf->default_pwm_freq != 0)
pwm_freq = conf->default_pwm_freq;
- /* Find EDID string and pwm freq in lookup table */
- for (i = 0; i < blc_array_len; i++) {
- if (!strncmp(blc_pwm[i].ascii_string, edid_ascii_string,
- strlen(blc_pwm[i].ascii_string))) {
- pwm_freq = blc_pwm[i].pwm_freq;
- printk(BIOS_DEBUG, "Found EDID string: %s in lookup table, pwm: %dHz\n",
- blc_pwm[i].ascii_string, pwm_freq);
- break;
- }
- }
-
- if (i == blc_array_len)
- printk(BIOS_NOTICE, "Your panels EDID `%s` wasn't found in the"
- "lookup table.\n You may have issues with your panels"
- "backlight.\n If you want to help improving coreboot"
- "please report: this EDID string\n and the result"
- "of `intel_read read BLC_PWM_CTL`"
- "(from intel-gpu-tools)\n while running vendor BIOS\n",
- edid_ascii_string);
-
if (pwm_freq == 0)
gtt_write(BLC_PWM_CTL, 0x06100610);
else