X60: enable Ultrabay if device is plugged in
authorSven Schnelle <svens@stackframe.org>
Wed, 27 Apr 2011 19:48:05 +0000 (19:48 +0000)
committerSven Schnelle <svens@stackframe.org>
Wed, 27 Apr 2011 19:48:05 +0000 (19:48 +0000)
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6548 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/mainboard/lenovo/x60/Makefile.inc
src/mainboard/lenovo/x60/devicetree.cb
src/mainboard/lenovo/x60/dock.c
src/mainboard/lenovo/x60/dock.h
src/mainboard/lenovo/x60/mainboard.c

index 75152586f838d533566ea09addd13cb56ef6d736..83cdeb9938d64da0ee881bca16bb69beb1b6283c 100644 (file)
@@ -19,3 +19,4 @@
 
 smm-$(CONFIG_HAVE_SMI_HANDLER) += mainboard_smi.c dock.c
 romstage-y += dock.c
+ramstage-y += dock.c
index d5ba7d979091ecd1ad02866a5d94aa832ea92c2c..01a42eb8160e0295c7467d79c9a8869387d92ec6 100644 (file)
@@ -156,7 +156,7 @@ chip northbridge/intel/i945
                                        end
                                end
                        end
-                       device pci 1f.1 off # IDE
+                       device pci 1f.1 on # IDE
                                subsystemid 0x17aa 0x200c
                        end
                        device pci 1f.2 on # SATA
index b64d864f4997116f303f358754c6b34fed2c9788..49e2d21b1f0866a41a0e74f5d2f2152c1c4bd573 100644 (file)
@@ -247,3 +247,8 @@ int dock_present(void)
 {
        return !((inb(DEFAULT_GPIOBASE + 0x0c) >> 13) & 1);
 }
+
+int dock_ultrabay_device_present(void)
+{
+       return inb(0x1621) & 0x02 ? 0 : 1;
+}
index 05c5cc4764eb1864a7b4e3c731965aa7a5de63bc..cd682234b53fed22e23a848b79c7f04e19582398 100644 (file)
@@ -5,4 +5,5 @@ extern int dock_connect(void);
 extern void dock_disconnect(void);
 extern int dock_present(void);
 extern int dlpc_init(void);
+extern int dock_ultrabay_device_present(void);
 #endif
index b9416b5c20267cf5adb208c2c555cab8f41bfcf7..f7bcb61f63c955e98d15ee0df969ff3e2782ff45 100644 (file)
 #include <ec/acpi/ec.h>
 #include <ec/lenovo/h8/h8.h>
 #include <northbridge/intel/i945/i945.h>
+#include "dock.h"
 
 static void mainboard_enable(device_t dev)
 {
-       device_t dev0;
+       device_t dev0, idedev;
 
        /* enable Audio */
        h8_set_audio_mute(0);
@@ -46,6 +47,19 @@ static void mainboard_enable(device_t dev)
        dev0 = dev_find_slot(0, PCI_DEVFN(0,0));
        if (dev0 && pci_read_config32(dev0, SKPAD) == 0xcafed00d)
                ec_write(0x0c, 0xc7);
+
+       idedev = dev_find_slot(0, PCI_DEVFN(0x1f,1));
+       if (idedev && idedev->chip_info && dock_ultrabay_device_present()) {
+               struct southbridge_intel_i82801gx_config *config = idedev->chip_info;
+               config->ide_enable_primary = 1;
+               /* enable Ultrabay power */
+               outb(inb(0x1628) | 0x01, 0x1628);
+               ec_write(0x0c, 0x84);
+       } else {
+               /* disable Ultrabay power */
+               outb(inb(0x1628) & ~0x01, 0x1628);
+               ec_write(0x0c, 0x04);
+       }
 }
 
 struct chip_operations mainboard_ops = {