diff options
| author | Mike Frysinger <vapier@gentoo.org> | 2009-11-12 22:26:02 -0500 | 
|---|---|---|
| committer | Ben Warren <biggerbadderben@gmail.com> | 2009-11-12 21:25:56 -0800 | 
| commit | c44efcf97b335dcef7d014f65b7d3094e79adb13 (patch) | |
| tree | 031ad7533de4bf3c0d0fb6146a649ac2cf466e2b /examples/standalone/smc911x_eeprom.c | |
| parent | 4f127980e0d4ba179b4628ebf8e8642210731055 (diff) | |
| download | olio-uboot-2014.01-c44efcf97b335dcef7d014f65b7d3094e79adb13.tar.xz olio-uboot-2014.01-c44efcf97b335dcef7d014f65b7d3094e79adb13.zip | |
smc911x_eeprom: fix building after smc911x overhaul
When the smc911x driver was converted to NET_MULTI, the smc911x eeprom was
missed.  The config option needed updating as well as overhauling of the
rergister read/write functions.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Tested-by: Mike Rapoport <mike.rapoport@gmail.com>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
Diffstat (limited to 'examples/standalone/smc911x_eeprom.c')
| -rw-r--r-- | examples/standalone/smc911x_eeprom.c | 122 | 
1 files changed, 62 insertions, 60 deletions
| diff --git a/examples/standalone/smc911x_eeprom.c b/examples/standalone/smc911x_eeprom.c index bf22f0a25..fff312346 100644 --- a/examples/standalone/smc911x_eeprom.c +++ b/examples/standalone/smc911x_eeprom.c @@ -2,7 +2,7 @@   * smc911x_eeprom.c - EEPROM interface to SMC911x parts.   * Only tested on SMSC9118 though ...   * - * Copyright 2004-2008 Analog Devices Inc. + * Copyright 2004-2009 Analog Devices Inc.   *   * Licensed under the GPL-2 or later.   * @@ -17,8 +17,12 @@  #include <common.h>  #include <exports.h> -#ifdef CONFIG_DRIVER_SMC911X - +/* the smc911x.h gets base addr through eth_device' iobase */ +struct eth_device { +	const char *name; +	unsigned long iobase; +	void *priv; +};  #include "../drivers/net/smc911x.h"  /** @@ -55,32 +59,32 @@ static void usage(void)   * Registers 0x00 - 0x50 are FIFOs.  The 0x50+ are the control registers   * and they're all 32bits long.  0xB8+ are reserved, so don't bother.   */ -static void dump_regs(void) +static void dump_regs(struct eth_device *dev)  {  	u8 i, j = 0;  	for (i = 0x50; i < 0xB8; i += sizeof(u32))  		printf("%02x: 0x%08x %c", i, -			smc911x_reg_read(CONFIG_DRIVER_SMC911X_BASE + i), +			smc911x_reg_read(dev, i),  			(j++ % 2 ? '\n' : ' '));  }  /**   *	do_eeprom_cmd - handle eeprom communication   */ -static int do_eeprom_cmd(int cmd, u8 reg) +static int do_eeprom_cmd(struct eth_device *dev, int cmd, u8 reg)  { -	if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) { +	if (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY) {  		printf("eeprom_cmd: busy at start (E2P_CMD = 0x%08x)\n", -			smc911x_reg_read(E2P_CMD)); +			smc911x_reg_read(dev, E2P_CMD));  		return -1;  	} -	smc911x_reg_write(E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg); +	smc911x_reg_write(dev, E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg); -	while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) +	while (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY)  		if (smsc_ctrlc()) {  			printf("eeprom_cmd: timeout (E2P_CMD = 0x%08x)\n", -				smc911x_reg_read(E2P_CMD)); +				smc911x_reg_read(dev, E2P_CMD));  			return -1;  		} @@ -90,37 +94,37 @@ static int do_eeprom_cmd(int cmd, u8 reg)  /**   *	read_eeprom_reg - read specified register in EEPROM   */ -static u8 read_eeprom_reg(u8 reg) +static u8 read_eeprom_reg(struct eth_device *dev, u8 reg)  { -	int ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_READ, reg); -	return (ret ? : smc911x_reg_read(E2P_DATA)); +	int ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_READ, reg); +	return (ret ? : smc911x_reg_read(dev, E2P_DATA));  }  /**   *	write_eeprom_reg - write specified value into specified register in EEPROM   */ -static int write_eeprom_reg(u8 value, u8 reg) +static int write_eeprom_reg(struct eth_device *dev, u8 value, u8 reg)  {  	int ret;  	/* enable erasing/writing */ -	ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWEN, reg); +	ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_EWEN, reg);  	if (ret)  		goto done;  	/* erase the eeprom reg */ -	ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_ERASE, reg); +	ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_ERASE, reg);  	if (ret)  		goto done;  	/* write the eeprom reg */ -	smc911x_reg_write(E2P_DATA, value); -	ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_WRITE, reg); +	smc911x_reg_write(dev, E2P_DATA, value); +	ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_WRITE, reg);  	if (ret)  		goto done;  	/* disable erasing/writing */ -	ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWDS, reg); +	ret = do_eeprom_cmd(dev, E2P_CMD_EPC_CMD_EWDS, reg);   done:  	return ret; @@ -139,7 +143,7 @@ static char *skip_space(char *buf)  /**   *	write_stuff - handle writing of MAC registers / eeprom   */ -static void write_stuff(char *line) +static void write_stuff(struct eth_device *dev, char *line)  {  	char dest;  	char *endp; @@ -182,39 +186,39 @@ static void write_stuff(char *line)  	/* Finally, execute the command */  	if (dest == 'E') {  		printf("Writing EEPROM register %02x with %02x\n", reg, value); -		write_eeprom_reg(value, reg); +		write_eeprom_reg(dev, value, reg);  	} else {  		printf("Writing MAC register %02x with %08x\n", reg, value); -		smc911x_reg_write(CONFIG_DRIVER_SMC911X_BASE + reg, value); +		smc911x_reg_write(dev, reg, value);  	}  }  /**   *	copy_from_eeprom - copy MAC address in eeprom to address registers   */ -static void copy_from_eeprom(void) +static void copy_from_eeprom(struct eth_device *dev)  {  	ulong addrl = -		read_eeprom_reg(0x01) | -		read_eeprom_reg(0x02) << 8 | -		read_eeprom_reg(0x03) << 16 | -		read_eeprom_reg(0x04) << 24; +		read_eeprom_reg(dev, 0x01) | +		read_eeprom_reg(dev, 0x02) << 8 | +		read_eeprom_reg(dev, 0x03) << 16 | +		read_eeprom_reg(dev, 0x04) << 24;  	ulong addrh = -		read_eeprom_reg(0x05) | -		read_eeprom_reg(0x06) << 8; -	smc911x_set_mac_csr(ADDRL, addrl); -	smc911x_set_mac_csr(ADDRH, addrh); +		read_eeprom_reg(dev, 0x05) | +		read_eeprom_reg(dev, 0x06) << 8; +	smc911x_set_mac_csr(dev, ADDRL, addrl); +	smc911x_set_mac_csr(dev, ADDRH, addrh);  	puts("EEPROM contents copied to MAC\n");  }  /**   *	print_macaddr - print MAC address registers and MAC address in eeprom   */ -static void print_macaddr(void) +static void print_macaddr(struct eth_device *dev)  {  	puts("Current MAC Address in MAC:     "); -	ulong addrl = smc911x_get_mac_csr(ADDRL); -	ulong addrh = smc911x_get_mac_csr(ADDRH); +	ulong addrl = smc911x_get_mac_csr(dev, ADDRL); +	ulong addrh = smc911x_get_mac_csr(dev, ADDRH);  	printf("%02x:%02x:%02x:%02x:%02x:%02x\n",  		(u8)(addrl), (u8)(addrl >> 8), (u8)(addrl >> 16),  		(u8)(addrl >> 24), (u8)(addrh), (u8)(addrh >> 8)); @@ -222,41 +226,42 @@ static void print_macaddr(void)  	puts("Current MAC Address in EEPROM:  ");  	int i;  	for (i = 1; i < 6; ++i) -		printf("%02x:", read_eeprom_reg(i)); -	printf("%02x\n", read_eeprom_reg(i)); +		printf("%02x:", read_eeprom_reg(dev, i)); +	printf("%02x\n", read_eeprom_reg(dev, i));  }  /**   *	dump_eeprom - dump the whole content of the EEPROM   */ -static void dump_eeprom(void) +static void dump_eeprom(struct eth_device *dev)  {  	int i;  	puts("EEPROM:\n");  	for (i = 0; i < 7; ++i) -		printf("%02x: 0x%02x\n", i, read_eeprom_reg(i)); +		printf("%02x: 0x%02x\n", i, read_eeprom_reg(dev, i));  }  /**   *	smc911x_init - get the MAC/EEPROM up and ready for use   */ -static int smc911x_init(void) +static int smc911x_init(struct eth_device *dev)  {  	/* See if there is anything there */ -	if (!smc911x_detect_chip()) +	if (!smc911x_detect_chip(dev))  		return 1; -	smc911x_reset(); +	smc911x_reset(dev);  	/* Make sure we set EEDIO/EECLK to the EEPROM */ -	if (smc911x_reg_read(GPIO_CFG) & GPIO_CFG_EEPR_EN) { -		while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) +	if (smc911x_reg_read(dev, GPIO_CFG) & GPIO_CFG_EEPR_EN) { +		while (smc911x_reg_read(dev, E2P_CMD) & E2P_CMD_EPC_BUSY)  			if (smsc_ctrlc()) {  				printf("init: timeout (E2P_CMD = 0x%08x)\n", -					smc911x_reg_read(E2P_CMD)); +					smc911x_reg_read(dev, E2P_CMD));  				return 1;  			} -		smc911x_reg_write(GPIO_CFG, smc911x_reg_read(GPIO_CFG) & ~GPIO_CFG_EEPR_EN); +		smc911x_reg_write(dev, GPIO_CFG, +			smc911x_reg_read(dev, GPIO_CFG) & ~GPIO_CFG_EEPR_EN);  	}  	return 0; @@ -317,6 +322,11 @@ static char *getline(void)   */  int smc911x_eeprom(int argc, char *argv[])  { +	/* Avoid initializing on stack as gcc likes to call memset() */ +	struct eth_device dev; +	dev.name = __func__; +	dev.iobase = CONFIG_SMC911X_BASE; +  	/* Print the ABI version */  	app_startup(argv);  	if (XF_VERSION != get_version()) { @@ -328,7 +338,7 @@ int smc911x_eeprom(int argc, char *argv[])  	/* Initialize the MAC/EEPROM somewhat */  	puts("\n"); -	if (smc911x_init()) +	if (smc911x_init(&dev))  		return 1;  	/* Dump helpful usage information */ @@ -360,11 +370,11 @@ int smc911x_eeprom(int argc, char *argv[])  		/* Now parse the command */  		switch (line[0]) { -		case 'W': write_stuff(line);  break; -		case 'D': dump_eeprom();      break; -		case 'M': dump_regs();        break; -		case 'C': copy_from_eeprom(); break; -		case 'P': print_macaddr();    break; +		case 'W': write_stuff(&dev, line); break; +		case 'D': dump_eeprom(&dev);       break; +		case 'M': dump_regs(&dev);         break; +		case 'C': copy_from_eeprom(&dev);  break; +		case 'P': print_macaddr(&dev);     break;  		unknown_cmd:  		default:  puts("ERROR: Unknown command!\n\n");  		case '?': @@ -373,11 +383,3 @@ int smc911x_eeprom(int argc, char *argv[])  		}  	}  } - -#else -int smc911x_eeprom(int argc, char *argv[]) -{ -	puts("Not supported for this board\n"); -	return 1; -} -#endif |