static int dock_superio_init(void) { int timeout = 1000; /* startup 14.318MHz Clock */ dock_write_register(0x29, 0xa0); /* wait until clock is settled */ while(!(dock_read_register(0x29) & 0x10) && timeout--) udelay(1000); if (!timeout) return 1; /* set GPIO pins to Serial/Parallel Port * functions */ dock_write_register(0x22, 0xa9); dock_write_register(0x07, PC87384_GPIO); dock_write_register(0x60, 0x16); dock_write_register(0x61, 0x20); /* enable GPIO */ dock_write_register(0x30, 0x01); dock_gpio_set_mode(0x00, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x01, PC87384_GPIO_PIN_TYPE_PUSH_PULL | PC87384_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x02, PC87384_GPIO_PIN_TYPE_PUSH_PULL | PC87384_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x03, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x04, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x05, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x06, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x07, PC87384_GPIO_PIN_DEBOUNCE | PC87384_GPIO_PIN_PULLUP, 0x00); /* no GPIO events enabled for PORT0 */ outb(0x00, 0x1622); /* clear GPIO events on PORT0 */ outb(0xff, 0x1623); outb(0xff, 0x1624); /* no GPIO events enabled for PORT1 */ outb(0x00, 0x1626); /* clear GPIO events on PORT1*/ outb(0xff, 0x1627); outb(0x1F, 0x1628); outb(0xfd, 0x1620); return 0; }
int dock_connect(void) { int timeout = 1000; outb(0x07, 0x164c); timeout = 1000; while(!(inb(0x164c) & 8) && timeout--) udelay(1000); if (!timeout) { /* docking failed, disable DLPC switch */ outb(0x00, 0x164c); dlpc_write_register(0x30, 0x00); return 1; } /* Assert D_PLTRST# */ outb(0xfe, 0x1680); udelay(100000); /* Deassert D_PLTRST# */ outb(0xff, 0x1680); 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); if (!timeout) return 1; /* Pin 6: CLKRUN * Pin 72: #DR1 * Pin 19: #SMI * Pin 73: #MTR */ dock_write_register(0x24, 0x37); /* PNF active HIGH */ dock_write_register(0x25, 0xa0); /* disable FDC */ dock_write_register(0x26, 0x01); /* Enable GPIO IRQ to #SMI */ dock_write_register(0x28, 0x02); /* select GPIO */ dock_write_register(0x07, 0x07); /* set base address */ dock_write_register(0x60, 0x16); dock_write_register(0x61, 0x20); /* init GPIO pins */ dock_gpio_set_mode(0x00, PC87392_GPIO_PIN_DEBOUNCE | PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x01, PC87392_GPIO_PIN_DEBOUNCE | PC87392_GPIO_PIN_PULLUP, PC87392_GPIO_PIN_TRIGGERS_SMI); dock_gpio_set_mode(0x02, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x03, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x04, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x05, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x06, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x07, PC87392_GPIO_PIN_PULLUP, 0x02); dock_gpio_set_mode(0x10, PC87392_GPIO_PIN_DEBOUNCE | PC87392_GPIO_PIN_PULLUP, PC87392_GPIO_PIN_TRIGGERS_SMI); dock_gpio_set_mode(0x11, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x12, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x13, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x14, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x15, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x16, PC87392_GPIO_PIN_PULLUP | PC87392_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x17, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x20, PC87392_GPIO_PIN_TYPE_PUSH_PULL | PC87392_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x21, PC87392_GPIO_PIN_TYPE_PUSH_PULL | PC87392_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x22, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x23, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x24, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x25, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x26, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x27, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x30, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x31, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x32, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x33, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x34, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x35, PC87392_GPIO_PIN_PULLUP | PC87392_GPIO_PIN_OE, 0x00); dock_gpio_set_mode(0x36, PC87392_GPIO_PIN_PULLUP, 0x00); dock_gpio_set_mode(0x37, PC87392_GPIO_PIN_PULLUP, 0x00); /* enable GPIO */ dock_write_register(0x30, 0x01); outb(0x00, 0x1628); outb(0x00, 0x1623); outb(0x82, 0x1622); outb(0xff, 0x1624); /* Enable USB and Ultrabay power */ outb(0x03, 0x1628); dock_write_register(0x07, 0x03); dock_write_register(0x30, 0x01); return 0; }