diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 5 | ||||
| -rw-r--r-- | common/cmd_eeprom.c | 4 | ||||
| -rw-r--r-- | common/cmd_mdio.c | 75 | ||||
| -rw-r--r-- | common/cmd_mii.c | 4 | ||||
| -rw-r--r-- | common/hash.c | 4 | ||||
| -rw-r--r-- | common/lcd.c | 10 | 
6 files changed, 73 insertions, 29 deletions
| diff --git a/common/Makefile b/common/Makefile index 32acbf935..74404beb3 100644 --- a/common/Makefile +++ b/common/Makefile @@ -232,14 +232,11 @@ obj-y += stdio.o  CPPFLAGS += -I.. -$(obj)env_embedded.o: $(src)env_embedded.c $(obj)../tools/envcrc +$(obj)env_embedded.o: $(src)env_embedded.c  	$(CC) $(AFLAGS) -Wa,--no-warn \  		-DENV_CRC=$(shell $(obj)../tools/envcrc) \  		-c -o $@ $(src)env_embedded.c -$(obj)../tools/envcrc: -	$(MAKE) -C ../tools -  # SEE README.arm-unaligned-accesses  $(obj)hush.o: CFLAGS += $(PLATFORM_NO_UNALIGNED)  $(obj)fdt_support.o: CFLAGS += $(PLATFORM_NO_UNALIGNED) diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c index ef694d8f8..02539c40a 100644 --- a/common/cmd_eeprom.c +++ b/common/cmd_eeprom.c @@ -161,7 +161,7 @@ int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt  #if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)  		spi_read (addr, alen, buffer, len);  #else -		if (i2c_read (addr[0], offset, alen-1, buffer, len) != 0) +		if (i2c_read (addr[0], addr[1], alen-1, buffer, len) != 0)  			rcode = 1;  #endif  		buffer += len; @@ -339,7 +339,7 @@ int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cn  		/* Write is enabled ... now write eeprom value.  		 */  #endif -		if (i2c_write (addr[0], offset, alen-1, buffer, len) != 0) +		if (i2c_write (addr[0], addr[1], alen-1, buffer, len) != 0)  			rcode = 1;  #endif diff --git a/common/cmd_mdio.c b/common/cmd_mdio.c index 65a1f10a9..fb13d0507 100644 --- a/common/cmd_mdio.c +++ b/common/cmd_mdio.c @@ -41,9 +41,11 @@ static int extract_range(char *input, int *plo, int *phi)  	return 0;  } -static int mdio_write_ranges(struct mii_dev *bus, int addrlo, +static int mdio_write_ranges(struct phy_device *phydev, struct mii_dev *bus, +			     int addrlo,  			     int addrhi, int devadlo, int devadhi, -			     int reglo, int reghi, unsigned short data) +			     int reglo, int reghi, unsigned short data, +			     int extended)  {  	int addr, devad, reg;  	int err = 0; @@ -51,7 +53,12 @@ static int mdio_write_ranges(struct mii_dev *bus, int addrlo,  	for (addr = addrlo; addr <= addrhi; addr++) {  		for (devad = devadlo; devad <= devadhi; devad++) {  			for (reg = reglo; reg <= reghi; reg++) { -				err = bus->write(bus, addr, devad, reg, data); +				if (!extended) +					err = bus->write(bus, addr, devad, +							 reg, data); +				else +					err = phydev->drv->writeext(phydev, +							addr, devad, reg, data);  				if (err)  					goto err_out; @@ -63,9 +70,10 @@ err_out:  	return err;  } -static int mdio_read_ranges(struct mii_dev *bus, int addrlo, +static int mdio_read_ranges(struct phy_device *phydev, struct mii_dev *bus, +			    int addrlo,  			    int addrhi, int devadlo, int devadhi, -			    int reglo, int reghi) +			    int reglo, int reghi, int extended)  {  	int addr, devad, reg; @@ -77,7 +85,12 @@ static int mdio_read_ranges(struct mii_dev *bus, int addrlo,  			for (reg = reglo; reg <= reghi; reg++) {  				int val; -				val = bus->read(bus, addr, devad, reg); +				if (!extended) +					val = bus->read(bus, addr, devad, reg); +				else +					val = phydev->drv->readext(phydev, addr, +						devad, reg); +  				if (val < 0) {  					printf("Error\n"); @@ -126,9 +139,10 @@ static int extract_reg_range(char *input, int *devadlo, int *devadhi,  }  static int extract_phy_range(char *const argv[], int argc, struct mii_dev **bus, +			     struct phy_device **phydev,  			     int *addrlo, int *addrhi)  { -	struct phy_device *phydev; +	struct phy_device *dev = *phydev;  	if ((argc < 1) || (argc > 2))  		return -1; @@ -154,11 +168,11 @@ static int extract_phy_range(char *const argv[], int argc, struct mii_dev **bus,  	 * device by the given name.  If none are found, we call  	 * extract_range() on the string, and see if it's an address range.  	 */ -	phydev = mdio_phydev_for_ethname(argv[0]); +	dev = mdio_phydev_for_ethname(argv[0]); -	if (phydev) { -		*addrlo = *addrhi = phydev->addr; -		*bus = phydev->bus; +	if (dev) { +		*addrlo = *addrhi = dev->addr; +		*bus = dev->bus;  		return 0;  	} @@ -175,6 +189,8 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	unsigned short	data;  	int pos = argc - 1;  	struct mii_dev *bus; +	struct phy_device *phydev = NULL; +	int extended = 0;  	if (argc < 2)  		return CMD_RET_USAGE; @@ -197,6 +213,29 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	if (flag & CMD_FLAG_REPEAT)  		op[0] = last_op[0]; +	if (strlen(argv[1]) > 1) { +		op[1] = argv[1][1]; +		if (op[1] == 'x') { +			phydev = mdio_phydev_for_ethname(argv[2]); + +			if (phydev) { +				addrlo = phydev->addr; +				addrhi = addrlo; +				bus = phydev->bus; +				extended = 1; +			} else { +				return -1; +			} + +			if (!phydev->drv || +			    (!phydev->drv->writeext && (op[0] == 'w')) || +			    (!phydev->drv->readext && (op[0] == 'r'))) { +				puts("PHY does not have extended functions\n"); +				return -1; +			} +		} +	} +  	switch (op[0]) {  	case 'w':  		if (pos > 1) @@ -210,7 +249,7 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	default:  		if (pos > 1)  			if (extract_phy_range(&(argv[2]), pos - 1, &bus, -					&addrlo, &addrhi)) +					&phydev, &addrlo, &addrhi))  				return -1;  		break; @@ -227,13 +266,13 @@ static int do_mdio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	switch (op[0]) {  	case 'w': -		mdio_write_ranges(bus, addrlo, addrhi, devadlo, devadhi, -				reglo, reghi, data); +		mdio_write_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, +				  reglo, reghi, data, extended);  		break;  	case 'r': -		mdio_read_ranges(bus, addrlo, addrhi, devadlo, devadhi, -				reglo, reghi); +		mdio_read_ranges(phydev, bus, addrlo, addrhi, devadlo, devadhi, +				 reglo, reghi, extended);  		break;  	} @@ -262,6 +301,10 @@ U_BOOT_CMD(  		"read PHY's register at <devad>.<reg>\n"  	"mdio write <phydev> [<devad>.]<reg> <data> - "  		"write PHY's register at <devad>.<reg>\n" +	"mdio rx <phydev> [<devad>.]<reg> - " +		"read PHY's extended register at <devad>.<reg>\n" +	"mdio wx <phydev> [<devad>.]<reg> <data> - " +		"write PHY's extended register at <devad>.<reg>\n"  	"<phydev> may be:\n"  	"   <busname>  <addr>\n"  	"   <addr>\n" diff --git a/common/cmd_mii.c b/common/cmd_mii.c index d3dd6b1c9..b82a7ce61 100644 --- a/common/cmd_mii.c +++ b/common/cmd_mii.c @@ -78,9 +78,9 @@ static const MII_field_desc_t reg_3_desc_tbl[] = {  static const MII_field_desc_t reg_4_desc_tbl[] = {  	{ 15, 15, 0x01, "next page able"               }, -	{ 14, 14, 0x01, "reserved"                     }, +	{ 14, 14, 0x01, "(reserved)"                   },  	{ 13, 13, 0x01, "remote fault"                 }, -	{ 12, 12, 0x01, "reserved"                     }, +	{ 12, 12, 0x01, "(reserved)"                   },  	{ 11, 11, 0x01, "asymmetric pause"             },  	{ 10, 10, 0x01, "pause enable"                 },  	{  9,  9, 0x01, "100BASE-T4 able"              }, diff --git a/common/hash.c b/common/hash.c index 722c40b3f..872cd8542 100644 --- a/common/hash.c +++ b/common/hash.c @@ -325,8 +325,8 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,  		printf("CRC32 for %08lx ... %08lx ==> %08lx\n",  				addr, addr + len - 1, crc); -		if (argc > 3) { -			ptr = (ulong *)simple_strtoul(argv[3], NULL, 16); +		if (argc >= 3) { +			ptr = (ulong *)simple_strtoul(argv[0], NULL, 16);  			*ptr = crc;  		}  	} diff --git a/common/lcd.c b/common/lcd.c index 5dd794812..56bf067fb 100644 --- a/common/lcd.c +++ b/common/lcd.c @@ -386,8 +386,13 @@ static void test_pattern(void)  /************************************************************************/  /* ** GENERIC Initialization Routines					*/  /************************************************************************/ - -int lcd_get_size(int *line_length) +/* + * With most lcd drivers the line length is set up + * by calculating it from panel_info parameters. Some + * drivers need to calculate the line length differently, + * so make the function weak to allow overriding it. + */ +__weak int lcd_get_size(int *line_length)  {  	*line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;  	return *line_length * panel_info.vl_row; @@ -495,7 +500,6 @@ static int lcd_init(void *lcdbase)  	debug("[LCD] Using LCD frambuffer at %p\n", lcd_base);  	lcd_get_size(&lcd_line_length); -	lcd_line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;  	lcd_is_enabled = 1;  	lcd_clear();  	lcd_enable(); |