/* Activate DLPC */
dlpc_write_register(0x30, 0x01);
+ dlpc_gpio_init();
+
+ return 0;
+}
+
+int dock_connect(void)
+{
+ int timeout = 1000;
+
outb(0x07, 0x164c);
timeout = 1000;
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);
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)
#include <ec/acpi/ec.h>
#include <pc80/mc146818rtc.h>
#include <ec/lenovo/h8/h8.h>
+#include <delay.h>
#include "dock.h"
#include "smi.h"
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);
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 */