X60: fix docking
authorSven Schnelle <svens@stackframe.org>
Tue, 10 Jan 2012 13:44:12 +0000 (14:44 +0100)
committerSven Schnelle <svens@stackframe.org>
Tue, 31 Jan 2012 16:53:29 +0000 (17:53 +0100)
Fix ordering of power/reset/undock procedure to prevent
crashes seen with the old code. Also call dlpc_init()
only once.

Change-Id: I27d1f42e845fcccde40e6ca5af4a7762edab5d36
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/597
Tested-by: build bot (Jenkins)
src/mainboard/lenovo/x60/dock.c
src/mainboard/lenovo/x60/mainboard_smi.c
src/mainboard/lenovo/x60/romstage.c

index eed00a1a26a2bbf3c9d74822ee90640e57895101..37d5b7652f2b3ea5d059c77ec68f42e3b1bc70a8 100644 (file)
@@ -107,6 +107,15 @@ int dlpc_init(void)
        /* Activate DLPC */
        dlpc_write_register(0x30, 0x01);
 
+       dlpc_gpio_init();
+
+       return 0;
+}
+
+int dock_connect(void)
+{
+       int timeout = 1000;
+
        outb(0x07, 0x164c);
 
        timeout = 1000;
@@ -121,26 +130,18 @@ int dlpc_init(void)
                return 1;
        }
 
-       dlpc_gpio_init();
-
-       return 0;
-}
-
-int dock_connect(void)
-{
-       int timeout = 1000;
-
        /* Assert D_PLTRST# */
        outb(0xfe, 0x1680);
        udelay(100000);
        /* Deassert D_PLTRST# */
        outb(0xff, 0x1680);
 
-       udelay(1000);
+       udelay(100000);
 
        /* startup 14.318MHz Clock */
        dock_write_register(0x29, 0x06);
        /* wait until clock is settled */
+       timeout = 1000;
        while(!(dock_read_register(0x29) & 0x08) && timeout--)
                udelay(1000);
 
@@ -243,12 +244,20 @@ int dock_connect(void)
 
 void dock_disconnect(void)
 {
-       /* disable Ultrabay and USB Power */
-       outb(0x00, 0x1628);
+       printk(BIOS_DEBUG, "%s enter\n", __func__);
        /* disconnect LPC bus */
        outb(0x00, 0x164c);
+       udelay(10000);
+
        /* Assert PLTRST and DLPCPD */
        outb(0xfc, 0x1680);
+       udelay(10000);
+
+       /* disable Ultrabay and USB Power */
+       outb(0x00, 0x1628);
+       udelay(10000);
+
+       printk(BIOS_DEBUG, "%s finish\n", __func__);
 }
 
 int dock_present(void)
index 34f1d36bb1d80db2d68882e66f30959411aa0a87..bd1333a6581ce60bc8d7e85582566c397a35fc94 100644 (file)
@@ -28,6 +28,7 @@
 #include <ec/acpi/ec.h>
 #include <pc80/mc146818rtc.h>
 #include <ec/lenovo/h8/h8.h>
+#include <delay.h>
 #include "dock.h"
 #include "smi.h"
 
@@ -72,8 +73,8 @@ int mainboard_io_trap_handler(int smif)
        switch (smif) {
        case SMI_DOCK_CONNECT:
                ec_clr_bit(0x03, 2);
-               dlpc_init();
-               if (!dlpc_init() && !dock_connect()) {
+               udelay(250000);
+               if (!dock_connect()) {
                        ec_set_bit(0x03, 2);
                        /* set dock LED to indicate status */
                        ec_write(0x0c, 0x09);
index 44cde72bbc59185e416ac51ba0cbe1550fd46937..ee080ea70a8f3438ba13498413a89d7dd91af992 100644 (file)
@@ -229,12 +229,12 @@ void main(unsigned long bist)
 
        ich7_enable_lpc();
 
-
+       dlpc_init();
        /* dock_init initializes the DLPC switch on
         *  thinpad side, so this is required even
         *  if we're undocked.
         */
-       if (!dlpc_init() && dock_present()) {
+       if (dock_present()) {
                dock_connect();
                early_superio_config();
                /* Set up the console */