The superio needs 0x87 sent twice to 0x3f0 to enable extended function
[coreboot.git] / src / superio / winbond / w83977tf / w83977tf_early_serial.c
index fffc16d430cbde7f8e037579bbdb319c800beb58..a956e11fc5fe5a1d7adce4f615177ad65ebc3e20 100644 (file)
@@ -1,11 +1,25 @@
 #include <arch/romcc_io.h>
 #include "w83977tf.h"
 
+static inline void pnp_enter_ext_func_mode(device_t dev)
+{
+       unsigned int port = dev >> 8;
+       outb(0x87, port);
+       outb(0x87, port);
+}
+
+static void pnp_exit_ext_func_mode(device_t dev)
+{
+       unsigned int port = dev >> 8;
+       outb(0xaa, port);
+}
 
-static void w83977tf_enable_serial(device_t dev, unsigned iobase)
+static void w83977tf_enable_serial(device_t dev, unsigned int iobase)
 {
+       pnp_enter_ext_func_mode(dev);
        pnp_set_logical_device(dev);
        pnp_set_enable(dev, 0);
        pnp_set_iobase(dev, PNP_IDX_IO0, iobase);
        pnp_set_enable(dev, 1);
+       pnp_exit_ext_func_mode(dev);
 }