[coreboot] [v2] r4445 - trunk/coreboot-v2/src/southbridge/ricoh/rl5c476

svn at coreboot.org svn at coreboot.org
Tue Jul 21 22:27:01 CEST 2009


Author: stepan
Date: 2009-07-21 22:27:00 +0200 (Tue, 21 Jul 2009)
New Revision: 4445

Modified:
   trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/chip.h
   trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
   trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.h
Log:
* cleanup ricoh rl5c476 code:
  - drop duplicate udelay function
  - simplify code flow
  - some cosmetics on comments

Signed-off-by: Stefan Reinauer <stepan at coresystems.de>
Acked-by: Peter Stuge <peter at stuge.se>



Modified: trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/chip.h
===================================================================
--- trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/chip.h	2009-07-21 18:06:12 UTC (rev 4444)
+++ trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/chip.h	2009-07-21 20:27:00 UTC (rev 4445)
@@ -5,7 +5,6 @@
 
 struct southbridge_ricoh_rl5c476_config {
 	int enable_cf;
-	
 };
 
-#endif /* _SOUTHBRIDGE_RL5C476 */
+#endif /* _SOUTHBRIDGE_RICOH_RL5C476 */

Modified: trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c
===================================================================
--- trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c	2009-07-21 18:06:12 UTC (rev 4444)
+++ trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.c	2009-07-21 20:27:00 UTC (rev 4445)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2004 Nick Barker <nick.barker9 at btinternet.com>
+ * (C) Copyright 2004-2005 Nick Barker <nick.barker at 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 at 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 @@
 	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);
+	if (!enable_cf_boot) {
+		printk_debug("CF boot not enabled.\n");
+		return;
+	}
+	
+	if (PCI_FUNC(dev->path.pci.devfn) != 1) {
+		// Only configure if second CF slot.
+		return;
+	}
 
-		/* 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);
+	/* make sure isa interrupts are enabled */
+	pci_write_config16(dev,0x3e,0x0780);
 
-		/* disable memory and io windows and turn off socket power */
-		pc16->pwctrl = 0;
+	/* 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 irq lines */
-		pc16->igctrl = 0;
+	/* disable memory and io windows and turn off socket power */
+	pc16->pwctrl = 0;
 
-		/* disable memory and I/O windows */
-		pc16->awinen = 0;
+	/* disable irq lines */
+	pc16->igctrl = 0;
 
-		/* reset card, configure for I/O and set IRQ line */
-		pc16->igctrl = 0x69;
+	/* disable memory and I/O windows */
+	pc16->awinen = 0;
 
-		// 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;
+	/* reset card, configure for I/O and set IRQ line */
+	pc16->igctrl = 0x69;
 
-		pc16->iospl0 = 0xef;
-		pc16->iosph0 = 1;
+	/* 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->ioffl0 = 0;
-		pc16->ioffh0 = 0;
+	pc16->iospl0 = 0xef;
+	pc16->iosph0 = 1;
 
-		// clear window 1
-		pc16->iostl1 = 0;
-		pc16->iosth1 = 0;
+	pc16->ioffl0 = 0;
+	pc16->ioffh0 = 0;
 
-		pc16->iospl1 = 0;
-		pc16->iosph1 = 0;
+	/* clear window 1 */
+	pc16->iostl1 = 0;
+	pc16->iosth1 = 0;
 
-		pc16->ioffl1 = 0x0;
-		pc16->ioffh1 = 0;
+	pc16->iospl1 = 0;
+	pc16->iosph1 = 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;
+	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;
 
+	/* set I/O width for Auto Data width */
+	pc16->ioctrl = 0x22;
 
-		// enable I/O window 0 and 1
-		pc16->awinen = 0xc1;
 
+	/* enable I/O window 0 and 1 */
+	pc16->awinen = 0xc1;
 
-		pc16->miscc1 = 1;
+	pc16->miscc1 = 1;
 
-		// apply power and enable outputs
-		pc16->pwctrl = 0xb0;
-	
+	/* apply power and enable outputs */
+	pc16->pwctrl = 0xb0;
 
-		// delay could be optimised, but this works
-		udelay(100000);
-	
-		pc16->igctrl = 0x69;
+	// 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 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;
-	}
+	/* 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 @@
 
 	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;

Modified: trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.h
===================================================================
--- trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.h	2009-07-21 18:06:12 UTC (rev 4444)
+++ trunk/coreboot-v2/src/southbridge/ricoh/rl5c476/rl5c476.h	2009-07-21 20:27:00 UTC (rev 4445)
@@ -1,7 +1,6 @@
 /*
  * (C) Copyright 2004 Nick Barker <nick.barker9 at 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





More information about the coreboot mailing list