diff options
Diffstat (limited to 'src/southbridge/ricoh/rl5c476')
-rw-r--r-- | src/southbridge/ricoh/rl5c476/chip.h | 3 | ||||
-rw-r--r-- | src/southbridge/ricoh/rl5c476/rl5c476.c | 219 | ||||
-rw-r--r-- | src/southbridge/ricoh/rl5c476/rl5c476.h | 1 |
3 files changed, 118 insertions, 105 deletions
diff --git a/src/southbridge/ricoh/rl5c476/chip.h b/src/southbridge/ricoh/rl5c476/chip.h index c4cd9d7997..922eece219 100644 --- a/src/southbridge/ricoh/rl5c476/chip.h +++ b/src/southbridge/ricoh/rl5c476/chip.h @@ -5,7 +5,6 @@ extern struct chip_operations southbridge_ricoh_rl5c476_ops; struct southbridge_ricoh_rl5c476_config { int enable_cf; - }; -#endif /* _SOUTHBRIDGE_RL5C476 */ +#endif /* _SOUTHBRIDGE_RICOH_RL5C476 */ diff --git a/src/southbridge/ricoh/rl5c476/rl5c476.c b/src/southbridge/ricoh/rl5c476/rl5c476.c index 5d5280d4bd..57e0993f82 100644 --- a/src/southbridge/ricoh/rl5c476/rl5c476.c +++ b/src/southbridge/ricoh/rl5c476/rl5c476.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2004 Nick Barker <nick.barker9@btinternet.com> + * (C) Copyright 2004-2005 Nick Barker <nick.barker@btinternet.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -16,8 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, * MA 02110-1301 USA */ -/* (C) Copyright 2005 Nick Barker <nick.barker@btinternet.com - brought into line with the current architecture of coreboot */ #include <arch/io.h> #include <device/device.h> @@ -32,21 +30,13 @@ static int enable_cf_boot = 0; static unsigned int cf_base; -static void udelay(int i) -{ - for(; i > 0 ; i--) - inb(0x80); -} - static void rl5c476_init(device_t dev) { - //unsigned char enables; pc16reg_t *pc16; - unsigned char *base; /* cardbus controller function 1 for CF Socket */ - printk_debug("rl5c476 init\n"); + printk_debug("Ricoh RL5c476: Initializing.\n"); printk_debug("CF Base = %0x\n",cf_base); @@ -54,98 +44,120 @@ static void rl5c476_init(device_t dev) pci_write_config16(dev,0x82,0x00a0); /* set up second slot as compact flash port if asked to do so */ - if( enable_cf_boot && (PCI_FUNC(dev->path.pci.devfn) == 1)){ - - /* make sure isa interrupts are enabled */ - pci_write_config16(dev,0x3e,0x0780); - - /* pick up where 16 bit card control structure is (0x800 bytes into config structure) */ - base = (unsigned char *)pci_read_config32(dev,0x10); - pc16 = (pc16reg_t *)(base + 0x800); - - /* disable memory and io windows and turn off socket power */ - pc16->pwctrl = 0; - - /* disable irq lines */ - pc16->igctrl = 0; - - /* disable memory and I/O windows */ - pc16->awinen = 0; - - /* reset card, configure for I/O and set IRQ line */ - pc16->igctrl = 0x69; - - // set io window 0 for 1e0 - 1ef - /* note this now sets CF up on a contiguous I/O window of 16 bytes, 0x1e0 to 0x1ef - Be warned that this is not a standard IDE address as automatically detected by the likes - of Filo, and would need patching to recognise these addresses as an IDE drive */ - /* an earlier version of this driver set up 2 io windows to emulate the expected addresses - for IDE2, however the pcmcia package within Linux then could not re-initiailse the - device as it tried to take control of it. So I belive it is easier to patch Filo or the like - to pick up this drive rather than playing silly games as the kernel tries to boot. - */ - pc16->iostl0 = 0xe0; - pc16->iosth0 = 1; - - pc16->iospl0 = 0xef; - pc16->iosph0 = 1; - - pc16->ioffl0 = 0; - pc16->ioffh0 = 0; - - // clear window 1 - pc16->iostl1 = 0; - pc16->iosth1 = 0; - pc16->iospl1 = 0; - pc16->iosph1 = 0; - - pc16->ioffl1 = 0x0; - pc16->ioffh1 = 0; - - // set up CF config window - pc16->smpga0 = cf_base>>24; - pc16->smsth0 = (cf_base>>20)&0x0f; - pc16->smstl0 = (cf_base>>12)&0xff; - pc16->smsph0 = ((cf_base>>20)&0x0f) | 0x80; - pc16->smspl0 = (cf_base>>12)&0xff; - pc16->moffl0 = 0; - pc16->moffh0 = 0x40; - - - // set I/O width for Auto Data width - pc16->ioctrl = 0x22; - - - // enable I/O window 0 and 1 - pc16->awinen = 0xc1; - - - pc16->miscc1 = 1; - - // apply power and enable outputs - pc16->pwctrl = 0xb0; - - - // delay could be optimised, but this works - udelay(100000); + if (!enable_cf_boot) { + printk_debug("CF boot not enabled.\n"); + return; + } - pc16->igctrl = 0x69; - - - // 16 bit CF always have first config byte at 0x200 into Config structure, - // but CF+ May Not according to spec - should locate through reading tuple data, - // but this will do for now !!! - unsigned char *cptr; - cptr = (unsigned char *)(cf_base + 0x200); - printk_debug("CF Config = %x\n",*cptr); - - // set CF to decode 16 IO bytes on any 16 byte boundary - rely on the io - // windows of the bridge set up above to map those bytes into the - // addresses for ide controller 3 (0x1e8 - 0x1ef and 0x3ed - 0x3ee) - *cptr = 0x41; + if (PCI_FUNC(dev->path.pci.devfn) != 1) { + // Only configure if second CF slot. + return; } + /* make sure isa interrupts are enabled */ + pci_write_config16(dev,0x3e,0x0780); + + /* pick up where 16 bit card control structure is + * (0x800 bytes into config structure) + */ + base = (unsigned char *)pci_read_config32(dev,0x10); + pc16 = (pc16reg_t *)(base + 0x800); + + /* disable memory and io windows and turn off socket power */ + pc16->pwctrl = 0; + + /* disable irq lines */ + pc16->igctrl = 0; + + /* disable memory and I/O windows */ + pc16->awinen = 0; + + /* reset card, configure for I/O and set IRQ line */ + pc16->igctrl = 0x69; + + /* set io window 0 for 1e0 - 1ef */ + /* NOTE: This now sets CF up on a contiguous I/O window of + * 16 bytes, 0x1e0 to 0x1ef. + * Be warned that this is not a standard IDE address as + * automatically detected by the likes of FILO, and would need + * patching to recognise these addresses as an IDE drive. + * + * An earlier version of this driver set up 2 I/O windows to + * emulate the expected addresses for IDE2, however the PCMCIA + * package within Linux then could not re-initialize the + * device as it tried to take control of it. So I believe it is + * easier to patch Filo or the like to pick up this drive + * rather than playing silly games as the kernel tries to + * boot. + * + * Nonetheless, FILO needs a special option enabled to boot + * from this configuration, and it needs to clean up + * afterwards. Please refer to FILO documentation and source + * code for more details. + */ + pc16->iostl0 = 0xe0; + pc16->iosth0 = 1; + + pc16->iospl0 = 0xef; + pc16->iosph0 = 1; + + pc16->ioffl0 = 0; + pc16->ioffh0 = 0; + + /* clear window 1 */ + pc16->iostl1 = 0; + pc16->iosth1 = 0; + + pc16->iospl1 = 0; + pc16->iosph1 = 0; + + pc16->ioffl1 = 0x0; + pc16->ioffh1 = 0; + + /* set up CF config window */ + pc16->smpga0 = cf_base>>24; + pc16->smsth0 = (cf_base>>20)&0x0f; + pc16->smstl0 = (cf_base>>12)&0xff; + pc16->smsph0 = ((cf_base>>20)&0x0f) | 0x80; + pc16->smspl0 = (cf_base>>12)&0xff; + pc16->moffl0 = 0; + pc16->moffh0 = 0x40; + + + /* set I/O width for Auto Data width */ + pc16->ioctrl = 0x22; + + + /* enable I/O window 0 and 1 */ + pc16->awinen = 0xc1; + + pc16->miscc1 = 1; + + /* apply power and enable outputs */ + pc16->pwctrl = 0xb0; + + // delay could be optimised, but this works + udelay(100000); + + pc16->igctrl = 0x69; + + + /* 16 bit CF always have first config byte at 0x200 into + * Config structure, but CF+ may not according to spec - + * should locate through reading tuple data, but this should + * do for now. + */ + unsigned char *cptr; + cptr = (unsigned char *)(cf_base + 0x200); + printk_debug("CF Config = %x\n",*cptr); + + /* Set CF to decode 16 IO bytes on any 16 byte boundary - + * rely on the io windows of the bridge set up above to + * map those bytes into the addresses for IDE controller 3 + * (0x1e8 - 0x1ef and 0x3ed - 0x3ee) + */ + *cptr = 0x41; } void rl5c476_read_resources(device_t dev) @@ -153,9 +165,12 @@ void rl5c476_read_resources(device_t dev) struct resource *resource; - /* for cf socket we need an extra memory window for the control structure of the cf itself */ + /* For CF socket we need an extra memory window for + * the control structure of the CF itself + */ if( enable_cf_boot && (PCI_FUNC(dev->path.pci.devfn) == 1)){ - resource = new_resource(dev,1); /* fake index as it isn't in pci config space */ + /* fake index as it isn't in PCI config space */ + resource = new_resource(dev, 1); resource->flags |= IORESOURCE_MEM ; resource->size = 0x1000; resource->align = resource->gran = 12; diff --git a/src/southbridge/ricoh/rl5c476/rl5c476.h b/src/southbridge/ricoh/rl5c476/rl5c476.h index 98fc95164b..966f6902f3 100644 --- a/src/southbridge/ricoh/rl5c476/rl5c476.h +++ b/src/southbridge/ricoh/rl5c476/rl5c476.h @@ -1,7 +1,6 @@ /* * (C) Copyright 2004 Nick Barker <nick.barker9@btinternet.com> * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of |