x86: Make sure i8254 is setup correctly before generating beeps
authorBin Meng <bmeng.cn@gmail.com>
Tue, 26 Feb 2019 09:52:19 +0000 (01:52 -0800)
committerBin Meng <bmeng.cn@gmail.com>
Mon, 11 Mar 2019 14:55:01 +0000 (22:55 +0800)
The i8254 timer control IO port (0x43) should be setup correctly
by using PIT counter 2 to generate beeps, however in U-Boot other
codes like TSC driver utilizes PIT for TSC frequency calibration
and configures the counter 2 to a different mode that does not
beep. Fix this by always ensuring the PIT counter 2 is correctly
initialized so that the i8254 beeper driver works as expected.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/x86/lib/i8254.c

index d0227954b16f3ef82e438c9c1c6065e1da2a4593..0f975389103df0d3846056c8a9df640345a45cf5 100644 (file)
@@ -51,6 +51,10 @@ int i8254_enable_beep(uint frequency_hz)
        if (!frequency_hz)
                return -EINVAL;
 
+       /* make sure i8254 is setup correctly before generating beeps */
+       outb(PIT_CMD_CTR2 | PIT_CMD_BOTH | PIT_CMD_MODE3,
+            PIT_BASE + PIT_COMMAND);
+
        i8254_set_beep_freq(frequency_hz);
        setio_8(SYSCTL_PORTB, PORTB_BEEP_ENABLE);