diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 44 | ||||
| -rw-r--r-- | common/cmd_immap.c | 2 | ||||
| -rw-r--r-- | common/cmd_mmc.c | 109 | ||||
| -rw-r--r-- | common/cmd_sf.c | 32 | ||||
| -rw-r--r-- | common/env_mmc.c | 12 | ||||
| -rw-r--r-- | common/image-fit.c | 2 | ||||
| -rw-r--r-- | common/usb_hub.c | 15 | ||||
| -rw-r--r-- | common/usb_kbd.c | 10 | 
8 files changed, 182 insertions, 44 deletions
diff --git a/common/Makefile b/common/Makefile index 3ba431626..35816037e 100644 --- a/common/Makefile +++ b/common/Makefile @@ -44,13 +44,11 @@ COBJS-$(CONFIG_SYS_GENERIC_BOARD) += board_r.o  COBJS-y += cmd_boot.o  COBJS-$(CONFIG_CMD_BOOTM) += cmd_bootm.o  COBJS-y += cmd_help.o -COBJS-y += cmd_nvedit.o  COBJS-y += cmd_version.o  # environment  COBJS-y += env_attr.o  COBJS-y += env_callback.o -COBJS-y += env_common.o  COBJS-y += env_flags.o  COBJS-$(CONFIG_ENV_IS_IN_DATAFLASH) += env_dataflash.o  COBJS-$(CONFIG_ENV_IS_IN_EEPROM) += env_eeprom.o @@ -191,14 +189,6 @@ COBJS-$(CONFIG_CMD_ZIP) += cmd_zip.o  COBJS-$(CONFIG_CMD_ZFS) += cmd_zfs.o  # others -ifdef CONFIG_DDR_SPD -SPD := y -endif -ifdef CONFIG_SPD_EEPROM -SPD := y -endif -COBJS-$(SPD) += ddr_spd.o -COBJS-$(CONFIG_HWCONFIG) += hwconfig.o  COBJS-$(CONFIG_BOOTSTAGE) += bootstage.o  COBJS-$(CONFIG_CONSOLE_MUX) += iomux.o  COBJS-y += flash.o @@ -216,18 +206,36 @@ COBJS-$(CONFIG_CMD_GPT) += cmd_gpt.o  endif  ifdef CONFIG_SPL_BUILD -COBJS-y += cmd_nvedit.o -COBJS-y += env_common.o  COBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o  COBJS-$(CONFIG_SPL_YMODEM_SUPPORT) += xyzModem.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += cmd_nvedit.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += env_attr.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += env_callback.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += env_common.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += env_flags.o -COBJS-$(CONFIG_SPL_NET_SUPPORT) += env_nowhere.o  COBJS-$(CONFIG_SPL_NET_SUPPORT) += miiphyutil.o +# environment +COBJS-$(CONFIG_SPL_ENV_SUPPORT) += env_attr.o +COBJS-$(CONFIG_SPL_ENV_SUPPORT) += env_flags.o +COBJS-$(CONFIG_SPL_ENV_SUPPORT) += env_callback.o +ifneq ($(CONFIG_SPL_NET_SUPPORT),y) +COBJS-$(CONFIG_ENV_IS_NOWHERE) += env_nowhere.o +COBJS-$(CONFIG_ENV_IS_IN_MMC) += env_mmc.o +COBJS-$(CONFIG_ENV_IS_IN_NAND) += env_nand.o +COBJS-$(CONFIG_ENV_IS_IN_SPI_FLASH) += env_sf.o +COBJS-$(CONFIG_ENV_IS_IN_FLASH) += env_flash.o +else +COBJS-y += env_nowhere.o +endif  endif +# core command +COBJS-y += cmd_nvedit.o +#environment +COBJS-y += env_common.o +#others +ifdef CONFIG_DDR_SPD +SPD := y +endif +ifdef CONFIG_SPD_EEPROM +SPD := y +endif +COBJS-$(SPD) += ddr_spd.o +COBJS-$(CONFIG_HWCONFIG) += hwconfig.o  COBJS-$(CONFIG_BOUNCE_BUFFER) += bouncebuf.o  COBJS-y += console.o  COBJS-y += dlmalloc.o diff --git a/common/cmd_immap.c b/common/cmd_immap.c index fdf9489b2..bb15795e2 100644 --- a/common/cmd_immap.c +++ b/common/cmd_immap.c @@ -535,7 +535,7 @@ do_i2cinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	volatile iic_t *iip;  	uint dpaddr; -	dpaddr = *((unsigned short *) (&immap->im_dprambase[PROFF_I2C_BASE])); +	dpaddr = immap->im_dprambase16[PROFF_I2C_BASE / sizeof(u16)];  	if (dpaddr == 0)  		iip = NULL;  	else diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index 7d824690b..5f1ed430e 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -147,6 +147,36 @@ U_BOOT_CMD(  	"- display info of the current MMC device"  ); +#ifdef CONFIG_SUPPORT_EMMC_BOOT +static int boot_part_access(struct mmc *mmc, u8 ack, u8 part_num, u8 access) +{ +	int err; +	err = mmc_boot_part_access(mmc, ack, part_num, access); + +	if ((err == 0) && (access != 0)) { +		printf("\t\t\t!!!Notice!!!\n"); + +		printf("!You must close EMMC boot Partition"); +		printf("after all images are written\n"); + +		printf("!EMMC boot partition has continuity"); +		printf("at image writing time.\n"); + +		printf("!So, do not close the boot partition"); +		printf("before all images are written.\n"); +		return 0; +	} else if ((err == 0) && (access == 0)) +		return 0; +	else if ((err != 0) && (access != 0)) { +		printf("EMMC boot partition-%d OPEN Failed.\n", part_num); +		return 1; +	} else { +		printf("EMMC boot partition-%d CLOSE Failed.\n", part_num); +		return 1; +	} +} +#endif +  static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  {  	enum mmc_state state; @@ -258,8 +288,74 @@ static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  				curr_device, mmc->part_num);  		return 0; -	} +#ifdef CONFIG_SUPPORT_EMMC_BOOT +	} else if ((strcmp(argv[1], "open") == 0) || +			(strcmp(argv[1], "close") == 0)) { +		int dev; +		struct mmc *mmc; +		u8 part_num, access = 0; + +		if (argc == 4) { +			dev = simple_strtoul(argv[2], NULL, 10); +			part_num = simple_strtoul(argv[3], NULL, 10); +		} else { +			return CMD_RET_USAGE; +		} + +		mmc = find_mmc_device(dev); +		if (!mmc) { +			printf("no mmc device at slot %x\n", dev); +			return 1; +		} +		if (IS_SD(mmc)) { +			printf("SD device cannot be opened/closed\n"); +			return 1; +		} + +		if ((part_num <= 0) || (part_num > MMC_NUM_BOOT_PARTITION)) { +			printf("Invalid boot partition number:\n"); +			printf("Boot partition number cannot be <= 0\n"); +			printf("EMMC44 supports only 2 boot partitions\n"); +			return 1; +		} + +		if (strcmp(argv[1], "open") == 0) +			access = part_num; /* enable R/W access to boot part*/ +		else +			access = 0; /* No access to boot partition */ + +		/* acknowledge to be sent during boot operation */ +		return boot_part_access(mmc, 1, part_num, access); + +	} else if (strcmp(argv[1], "bootpart") == 0) { +		int dev; +		dev = simple_strtoul(argv[2], NULL, 10); + +		u32 bootsize = simple_strtoul(argv[3], NULL, 10); +		u32 rpmbsize = simple_strtoul(argv[4], NULL, 10); +		struct mmc *mmc = find_mmc_device(dev); +		if (!mmc) { +			printf("no mmc device at slot %x\n", dev); +			return 1; +		} + +		if (IS_SD(mmc)) { +			printf("It is not a EMMC device\n"); +			return 1; +		} + +		if (0 == mmc_boot_partition_size_change(mmc, +							bootsize, rpmbsize)) { +			printf("EMMC boot partition Size %d MB\n", bootsize); +			printf("EMMC RPMB partition Size %d MB\n", rpmbsize); +			return 0; +		} else { +			printf("EMMC boot partition Size change Failed.\n"); +			return 1; +		} +#endif /* CONFIG_SUPPORT_EMMC_BOOT */ +	}  	state = MMC_INVALID;  	if (argc == 5 && strcmp(argv[1], "read") == 0)  		state = MMC_READ; @@ -334,5 +430,14 @@ U_BOOT_CMD(  	"mmc rescan\n"  	"mmc part - lists available partition on current mmc device\n"  	"mmc dev [dev] [part] - show or set current mmc device [partition]\n" -	"mmc list - lists available devices"); +	"mmc list - lists available devices\n" +#ifdef CONFIG_SUPPORT_EMMC_BOOT +	"mmc open <dev> <boot_partition>\n" +	" - Enable boot_part for booting and enable R/W access of boot_part\n" +	"mmc close <dev> <boot_partition>\n" +	" - Enable boot_part for booting and disable access to boot_part\n" +	"mmc bootpart <device num> <boot part size MB> <RPMB part size MB>\n" +	" - change sizes of boot and RPMB partions of specified device\n"  #endif +	); +#endif /* !CONFIG_GENERIC_MMC */ diff --git a/common/cmd_sf.c b/common/cmd_sf.c index 0a17782d6..19b0dc9f4 100644 --- a/common/cmd_sf.c +++ b/common/cmd_sf.c @@ -234,7 +234,7 @@ static int do_spi_flash_read_write(int argc, char * const argv[])  	unsigned long len;  	void *buf;  	char *endp; -	int ret; +	int ret = 1;  	if (argc < 4)  		return -1; @@ -264,19 +264,23 @@ static int do_spi_flash_read_write(int argc, char * const argv[])  	if (strcmp(argv[0], "update") == 0)  		ret = spi_flash_update(flash, offset, len, buf); -	else if (strcmp(argv[0], "read") == 0) -		ret = spi_flash_read(flash, offset, len, buf); -	else -		ret = spi_flash_write(flash, offset, len, buf); +	else if (strncmp(argv[0], "read", 4) == 0 || +			strncmp(argv[0], "write", 5) == 0) { +		int read; -	unmap_physmem(buf, len); +		read = strncmp(argv[0], "read", 4) == 0; +		if (read) +			ret = spi_flash_read(flash, offset, len, buf); +		else +			ret = spi_flash_write(flash, offset, len, buf); -	if (ret) { -		printf("SPI flash %s failed\n", argv[0]); -		return 1; +		printf("SF: %zu bytes @ %#x %s: %s\n", (size_t)len, (u32)offset, +			read ? "Read" : "Written", ret ? "ERROR" : "OK");  	} -	return 0; +	unmap_physmem(buf, len); + +	return ret == 0 ? 0 : 1;  }  static int do_spi_flash_erase(int argc, char * const argv[]) @@ -305,12 +309,10 @@ static int do_spi_flash_erase(int argc, char * const argv[])  	}  	ret = spi_flash_erase(flash, offset, len); -	if (ret) { -		printf("SPI flash %s failed\n", argv[0]); -		return 1; -	} +	printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset, +			ret ? "ERROR" : "OK"); -	return 0; +	return ret == 0 ? 0 : 1;  }  #ifdef CONFIG_CMD_SF_TEST diff --git a/common/env_mmc.c b/common/env_mmc.c index 9ca098fa6..5d3a769db 100644 --- a/common/env_mmc.c +++ b/common/env_mmc.c @@ -53,11 +53,19 @@ DECLARE_GLOBAL_DATA_PTR;  __weak int mmc_get_env_addr(struct mmc *mmc, int copy, u32 *env_addr)  { -	*env_addr = CONFIG_ENV_OFFSET; +	s64 offset; + +	offset = CONFIG_ENV_OFFSET;  #ifdef CONFIG_ENV_OFFSET_REDUND  	if (copy) -		*env_addr = CONFIG_ENV_OFFSET_REDUND; +		offset = CONFIG_ENV_OFFSET_REDUND;  #endif + +	if (offset < 0) +		offset += mmc->capacity; + +	*env_addr = offset; +  	return 0;  } diff --git a/common/image-fit.c b/common/image-fit.c index 7bf82d33c..f40f1603f 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -1557,7 +1557,7 @@ int fit_image_load(bootm_headers_t *images, const char *prop_name, ulong addr,  	if (fit_image_get_data(fit, noffset, &buf, &size)) {  		printf("Could not find %s subimage data!\n", prop_name);  		bootstage_error(bootstage_id + BOOTSTAGE_SUB_GET_DATA); -		return -ENOMEDIUM; +		return -ENOENT;  	}  	len = (ulong)size; diff --git a/common/usb_hub.c b/common/usb_hub.c index 0d79ec3ea..774ba6387 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -53,6 +53,10 @@  #include <asm/4xx_pci.h>  #endif +#ifndef CONFIG_USB_HUB_MIN_POWER_ON_DELAY +#define CONFIG_USB_HUB_MIN_POWER_ON_DELAY	100 +#endif +  #define USB_BUFSIZ	512  static struct usb_hub_device hub_dev[USB_MAX_HUB]; @@ -148,8 +152,8 @@ static void usb_hub_power_on(struct usb_hub_device *hub)  		debug("port %d returns %lX\n", i + 1, dev->status);  	} -	/* Wait at least 100 msec for power to become stable */ -	mdelay(max(pgood_delay, (unsigned)100)); +	/* Wait for power to become stable */ +	mdelay(max(pgood_delay, CONFIG_USB_HUB_MIN_POWER_ON_DELAY));  }  void usb_hub_reset(void) @@ -485,7 +489,11 @@ static int usb_hub_configure(struct usb_device *dev)  			      i + 1, portstatus);  			usb_clear_port_feature(dev, i + 1,  						USB_PORT_FEAT_C_ENABLE); - +			/* +			 * The following hack causes a ghost device problem +			 * to Faraday EHCI +			 */ +#ifndef CONFIG_USB_EHCI_FARADAY  			/* EM interference sometimes causes bad shielded USB  			 * devices to be shutdown by the hub, this hack enables  			 * them again. Works at least with mouse driver */ @@ -497,6 +505,7 @@ static int usb_hub_configure(struct usb_device *dev)  				      "re-enabling...\n", i + 1);  				      usb_hub_port_connect_change(dev, i);  			} +#endif  		}  		if (portstatus & USB_PORT_STAT_SUSPEND) {  			debug("port %d suspend change\n", i + 1); diff --git a/common/usb_kbd.c b/common/usb_kbd.c index b96284992..3174b5e1b 100644 --- a/common/usb_kbd.c +++ b/common/usb_kbd.c @@ -461,8 +461,13 @@ static int usb_kbd_probe(struct usb_device *dev, unsigned int ifnum)  	usb_set_idle(dev, iface->desc.bInterfaceNumber, REPEAT_RATE, 0);  	debug("USB KBD: enable interrupt pipe...\n"); -	usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp, -				ep->bInterval); +	if (usb_submit_int_msg(dev, pipe, data->new, maxp > 8 ? 8 : maxp, +			       ep->bInterval) < 0) { +		printf("Failed to get keyboard state from device %04x:%04x\n", +		       dev->descriptor.idVendor, dev->descriptor.idProduct); +		/* Abort, we don't want to use that non-functional keyboard. */ +		return 0; +	}  	/* Success. */  	return 1; @@ -496,6 +501,7 @@ int drv_usb_kbd_init(void)  		if (old_dev) {  			/* Already registered, just return ok. */  			debug("USB KBD: is already registered.\n"); +			usb_kbd_deregister();  			return 1;  		}  |