Merge tag 'x86-pull-20230809' of https://source.denx.de/u-boot/custodians/u-boot-x86
[platform/kernel/u-boot.git] / arch / x86 / lib / i8254.c
index 46a4245..a8d1db1 100644 (file)
@@ -1,16 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2002
  * Daniel Engström, Omicron Ceti AB, <daniel@omicron.se>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <asm/io.h>
 #include <asm/i8254.h>
+#include <asm/ibmpc.h>
 
-#define TIMER1_VALUE   18      /* 15.6us */
-#define TIMER2_VALUE   0x0a8e  /* 440Hz */
+#define TIMER1_VALUE           18      /* 15.6us */
+#define BEEP_FREQUENCY_HZ      440
+#define SYSCTL_PORTB           0x61
+#define PORTB_BEEP_ENABLE      0x3
+
+static void i8254_set_beep_freq(uint frequency_hz)
+{
+       uint countdown;
+
+       countdown = PIT_TICK_RATE / frequency_hz;
+
+       outb(countdown & 0xff, PIT_BASE + PIT_T2);
+       outb((countdown >> 8) & 0xff, PIT_BASE + PIT_T2);
+}
 
 int i8254_init(void)
 {
@@ -30,8 +42,27 @@ int i8254_init(void)
         */
        outb(PIT_CMD_CTR2 | PIT_CMD_BOTH | PIT_CMD_MODE3,
             PIT_BASE + PIT_COMMAND);
-       outb(TIMER2_VALUE & 0xff, PIT_BASE + PIT_T2);
-       outb(TIMER2_VALUE >> 8, PIT_BASE + PIT_T2);
+       i8254_set_beep_freq(BEEP_FREQUENCY_HZ);
 
        return 0;
 }
+
+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);
+
+       return 0;
+}
+
+void i8254_disable_beep(void)
+{
+       clrio_8(SYSCTL_PORTB, PORTB_BEEP_ENABLE);
+}