* [PATCH] Merge Embedded Planet board information parsers into a single function
@ 2006-01-31 16:33 Laurent Pinchart
0 siblings, 0 replies; only message in thread
From: Laurent Pinchart @ 2006-01-31 16:33 UTC (permalink / raw)
To: linuxppc-embedded
[-- Attachment #1: Type: text/plain, Size: 370 bytes --]
Hi everybody,
arch/ppc/boot/simple/embed_config.c has duplicate board information parsing
code. This patch merges the parsers into a single function.
This is the first time I use git, so please point out the mistakes I probably
did. I didn't include EP8248 support in this patch, as Tom Rini pointed out
that it would have to wait for 2.6.17-rc1.
Laurent Pinchart
[-- Attachment #2: ep-parser.patch --]
[-- Type: text/x-diff, Size: 8222 bytes --]
Merge Embedded Planet board information parsers into a single function.
The Embedded Planet boot loader passes board information as a text string
which must be parsed. This patch merges the multiple parser implementations
into a single one.
Signed-off-by: Laurent Pinchart <laurent.pinchart@tbox.biz>
---
arch/ppc/boot/simple/embed_config.c | 236 +++++++++++------------------------
arch/ppc/platforms/rpx8260.h | 2
2 files changed, 73 insertions(+), 165 deletions(-)
1ea98a415a76c902314014e17a3b76fec3dbedf8
diff --git a/arch/ppc/boot/simple/embed_config.c b/arch/ppc/boot/simple/embed_config.c
index 491a691..9ab2851 100644
--- a/arch/ppc/boot/simple/embed_config.c
+++ b/arch/ppc/boot/simple/embed_config.c
@@ -147,7 +147,6 @@ rpx_eth(bd_t *bd, u_char *cp)
}
}
-#ifdef CONFIG_RPX8260
static uint
rpx_baseten(u_char *cp)
{
@@ -162,26 +161,9 @@ rpx_baseten(u_char *cp)
}
return(retval);
}
-#endif
#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
static void
-rpx_brate(bd_t *bd, u_char *cp)
-{
- uint rate;
-
- rate = 0;
-
- while (*cp != '\n') {
- rate *= 10;
- rate += (*cp) - '0';
- cp++;
- }
-
- bd->bi_baudrate = rate * 100;
-}
-
-static void
rpx_cpuspeed(bd_t *bd, u_char *cp)
{
uint num, den;
@@ -217,69 +199,11 @@ rpx_cpuspeed(bd_t *bd, u_char *cp)
}
#endif
-#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC) || defined(CONFIG_EP405)
-static void
-rpx_memsize(bd_t *bd, u_char *cp)
-{
- uint size;
-
- size = 0;
-
- while (*cp != '\n') {
- size *= 10;
- size += (*cp) - '0';
- cp++;
- }
-
- bd->bi_memsize = size * 1024 * 1024;
-}
-#endif /* LITE || CLASSIC || EP405 */
-#if defined(CONFIG_EP405)
static void
-rpx_nvramsize(bd_t *bd, u_char *cp)
-{
- uint size;
-
- size = 0;
-
- while (*cp != '\n') {
- size *= 10;
- size += (*cp) - '0';
- cp++;
- }
-
- bd->bi_nvramsize = size * 1024;
-}
-#endif /* CONFIG_EP405 */
-
-#endif /* Embedded Planet boards */
-
-#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
-
-/* Read the EEPROM on the RPX-Lite board.
-*/
-void
-embed_config(bd_t **bdp)
+ep_parse_keyvals(bd_t *bd, u_char *keyvals)
{
- u_char eebuf[256], *cp;
- bd_t *bd;
+ u_char *cp = keyvals;
- /* Read the first 256 bytes of the EEPROM. I think this
- * is really all there is, and I hope if it gets bigger the
- * info we want is still up front.
- */
- bd = &bdinfo;
- *bdp = bd;
-
-#if 1
- iic_read(0xa8, eebuf, 0, 128);
- iic_read(0xa8, &eebuf[128], 128, 128);
-
- /* We look for two things, the Ethernet address and the
- * serial baud rate. The records are separated by
- * newlines.
- */
- cp = eebuf;
for (;;) {
if (*cp == 'E') {
cp++;
@@ -288,20 +212,28 @@ embed_config(bd_t **bdp)
rpx_eth(bd, cp);
}
}
+#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC) || \
+ defined(CONFIG_RPX8260)
if (*cp == 'S') {
cp++;
if (*cp == 'B') {
cp += 2;
- rpx_brate(bd, cp);
+#if defined(CONFIG_RPX8260)
+ bd->bi_baudrate = rpx_baseten(cp);
+#else
+ bd->bi_baudrate = rpx_baseten(cp) * 100;
+#endif
}
}
+#endif
if (*cp == 'D') {
cp++;
if (*cp == '1') {
cp += 2;
- rpx_memsize(bd, cp);
+ bd->bi_memsize = rpx_baseten(cp) * 1024 * 1024;
}
}
+#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
if (*cp == 'H') {
cp++;
if (*cp == 'Z') {
@@ -309,6 +241,29 @@ embed_config(bd_t **bdp)
rpx_cpuspeed(bd, cp);
}
}
+#endif
+#if defined(CONFIG_EP405) || defined(CONFIG_RPX8260)
+ if (*cp == 'N') {
+ cp++;
+ if (*cp == 'V') {
+ cp += 2;
+#if defined(CONFIG_EP405)
+ bd->bi_nvramsize = rpx_baseten(cp) * 1024;
+#else
+ bd->bi_nvramsize = rpx_baseten(cp) * 1024 * 1024;
+#endif
+ }
+ }
+#endif
+#if defined(CONFIG_RPX8260)
+ if (*cp == 'X') {
+ cp++;
+ if (*cp == 'T') {
+ cp += 2;
+ bd->bi_busfreq = rpx_baseten(cp);
+ }
+ }
+#endif
/* Scan to the end of the record.
*/
@@ -317,10 +272,42 @@ embed_config(bd_t **bdp)
/* If the next character is a 0 or ff, we are done.
*/
+
cp++;
if ((*cp == 0) || (*cp == 0xff))
break;
}
+}
+
+#endif /* Embedded Planet boards */
+
+#if defined(CONFIG_RPXLITE) || defined(CONFIG_RPXCLASSIC)
+
+/* Read the EEPROM on the RPX-Lite board.
+*/
+void
+embed_config(bd_t **bdp)
+{
+ u_char eebuf[256];
+ bd_t *bd;
+
+ /* Read the first 256 bytes of the EEPROM. I think this
+ * is really all there is, and I hope if it gets bigger the
+ * info we want is still up front.
+ */
+ bd = &bdinfo;
+ *bdp = bd;
+
+#if 1
+ iic_read(0xa8, eebuf, 0, 128);
+ iic_read(0xa8, &eebuf[128], 128, 128);
+
+ /* We look for two things, the Ethernet address and the
+ * serial baud rate. The records are separated by
+ * newlines.
+ */
+ ep_parse_keyvals(bd, eebuf);
+
bd->bi_memstart = 0;
#else
/* For boards without initialized EEPROM.
@@ -588,12 +575,11 @@ embed_config(bd_t **bdp)
}
#endif /* SBS8260 */
-#ifdef CONFIG_RPX8260
+#if defined(CONFIG_RPX8260)
void
embed_config(bd_t **bdp)
{
- u_char *cp, *keyvals;
- int i;
+ u_char *keyvals;
bd_t *bd;
keyvals = (u_char *)*bdp;
@@ -606,55 +592,8 @@ embed_config(bd_t **bdp)
* function in a string, but the format of all of the fields
* is slightly different.
*/
- cp = keyvals;
- for (;;) {
- if (*cp == 'E') {
- cp++;
- if (*cp == 'A') {
- cp += 2;
- rpx_eth(bd, cp);
- }
- }
- if (*cp == 'S') {
- cp++;
- if (*cp == 'B') {
- cp += 2;
- bd->bi_baudrate = rpx_baseten(cp);
- }
- }
- if (*cp == 'D') {
- cp++;
- if (*cp == '1') {
- cp += 2;
- bd->bi_memsize = rpx_baseten(cp) * 1024 * 1024;
- }
- }
- if (*cp == 'X') {
- cp++;
- if (*cp == 'T') {
- cp += 2;
- bd->bi_busfreq = rpx_baseten(cp);
- }
- }
- if (*cp == 'N') {
- cp++;
- if (*cp == 'V') {
- cp += 2;
- bd->bi_nvsize = rpx_baseten(cp) * 1024 * 1024;
- }
- }
+ ep_parse_keyvals(bd, keyvals);
- /* Scan to the end of the record.
- */
- while ((*cp != '\n') && (*cp != 0xff))
- cp++;
-
- /* If the next character is a 0 or ff, we are done.
- */
- cp++;
- if ((*cp == 0) || (*cp == 0xff))
- break;
- }
bd->bi_memstart = 0;
/* The memory size includes both the 60x and local bus DRAM.
@@ -673,7 +612,7 @@ embed_config(bd_t **bdp)
*/
bd->bi_intfreq = 200000000;
}
-#endif /* RPX6 for testing */
+#endif /* CONFIG_RXP8260 */
#ifdef CONFIG_ADS8260
void
@@ -853,7 +792,6 @@ void
embed_config(bd_t **bdp)
{
u32 chcr0;
- u_char *cp;
bd_t *bd;
/* Different versions of the PlanetCore firmware vary in how
@@ -882,38 +820,8 @@ embed_config(bd_t **bdp)
bd = &bdinfo;
*bdp = bd;
#if 1
- cp = (u_char *)0xF0000EE0;
- for (;;) {
- if (*cp == 'E') {
- cp++;
- if (*cp == 'A') {
- cp += 2;
- rpx_eth(bd, cp);
- }
- }
-
- if (*cp == 'D') {
- cp++;
- if (*cp == '1') {
- cp += 2;
- rpx_memsize(bd, cp);
- }
- }
-
- if (*cp == 'N') {
- cp++;
- if (*cp == 'V') {
- cp += 2;
- rpx_nvramsize(bd, cp);
- }
- }
- while ((*cp != '\n') && (*cp != 0xff))
- cp++;
+ ep_parse_keyvals(bd, (u_char*)0xF0000EE0);
- cp++;
- if ((*cp == 0) || (*cp == 0xff))
- break;
- }
bd->bi_intfreq = 200000000;
bd->bi_busfreq = 100000000;
bd->bi_pci_busfreq= 33000000 ;
diff --git a/arch/ppc/platforms/rpx8260.h b/arch/ppc/platforms/rpx8260.h
index 843494a..e8d8fe3 100644
--- a/arch/ppc/platforms/rpx8260.h
+++ b/arch/ppc/platforms/rpx8260.h
@@ -15,7 +15,7 @@
typedef struct bd_info {
unsigned int bi_memstart; /* Memory start address */
unsigned int bi_memsize; /* Memory (end) size in bytes */
- unsigned int bi_nvsize; /* NVRAM size in bytes (can be 0) */
+ unsigned int bi_nvramsize; /* NVRAM size in bytes (can be 0) */
unsigned int bi_intfreq; /* Internal Freq, in Hz */
unsigned int bi_busfreq; /* Bus Freq, in MHz */
unsigned int bi_cpmfreq; /* CPM Freq, in MHz */
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2006-01-31 16:33 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-01-31 16:33 [PATCH] Merge Embedded Planet board information parsers into a single function Laurent Pinchart
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).