1 #include <console/console.h>
2 #include <device/device.h>
3 #include <device/pci.h>
4 #include <device/pci_ids.h>
5 #include <device/pci_ops.h>
7 #include <pc80/mc146818rtc.h>
9 #include "../southbridge/amd/cs5536/cs5536_smbus2.h"
10 #include <cpu/amd/vr.h>
12 /* Borrowed from mc146818rtc.c */
14 #define CMOS_READ(addr) ({ \
15 outb((addr),RTC_PORT(0)); \
19 #define CMOS_WRITE(val, addr) ({ \
20 outb((addr),RTC_PORT(0)); \
21 outb((val),RTC_PORT(1)); \
24 static void write_bit(unsigned char val) {
26 unsigned char byte = CMOS_READ(440 / 8);
28 /* Don't change it if its already set */
30 if ((byte & 1) == (val & 1))
35 CMOS_WRITE(val, 440/8);
38 static unsigned short _getsmbusbase(void) {
39 unsigned devfn = PCI_DEVFN(0xf, 0);
40 device_t dev = dev_find_slot(0x0, devfn);
41 unsigned long addr = pci_read_config32(dev, PCI_BASE_ADDRESS_0);
43 return (unsigned short) (addr & ~1);
46 static void init_dcon(void) {
49 unsigned short rev = 0;
50 unsigned short iobase = _getsmbusbase();
52 printk_debug("CHECKING FOR DCON (%x)\n", iobase);
54 /* Get the IO base for the SMBUS */
56 rev = do_smbus_read_word(iobase, 0x0D << 1, 0x00);
59 printk_debug("DCON FOUND - REV %x\n", rev);
62 ret = do_smbus_write_word(iobase, 0x0D << 1, 0x01, 0x0069);
64 printk_debug("DCON ENABLE FAILED\n", ret);
67 printk_debug("DCON NOT FOUND (%x)\n", rev);
69 write_bit(rev > 0 ? 1 : 0);
74 const unsigned char slots_cafe[4] = {11, 0, 0, 0};
78 pci_assign_irqs(0, 0x0C, slots_cafe);
80 /* Make the pin assignments - NOTENOTENOTE: This should be
84 /* Configure the GPIO pins to use - class 0, index 9 to configure
85 * AB. Write 0xFF to disable
90 /* Configure the GPIO pins to use - class 0, index A to configure
91 * CD. Write 0xFF to disable
99 static void init(struct device *dev) {
102 unsigned devfn = PCI_DEVFN(0xf, 4);
104 unsigned char usbirq = 0xa;
107 printk_debug("OLPC BTEST ENTER %s\n", __func__);
110 /* I can't think of any reason NOT to just set this. If it turns out we want this to be
111 * conditional we can make it a config variable later.
114 printk_debug("%s (%x,%x)SET USB PCI interrupt line to %d\n",
115 __func__, bus, devfn, usbirq);
116 usb = dev_find_slot(bus, devfn);
118 printk_err("Could not find USB\n");
120 pci_write_config8(usb, PCI_INTERRUPT_LINE, usbirq);
126 printk_debug("OLPC BTEST EXIT %s\n", __func__);
129 static void enable_dev(struct device *dev)
131 dev->ops->init = init;
134 struct chip_operations mainboard_olpc_btest_ops = {
135 CHIP_NAME("OLPC btest Mainboard")
136 .enable_dev = enable_dev,