sandbox: spi: Add more logging
Add logging to aid debugging features in these drivers. Also drop some code in sandbox_spi_xfer() which is not used. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									1c5a81d803
								
							
						
					
					
						commit
						c3aed5db59
					
				|  | @ -8,6 +8,8 @@ | ||||||
|  * Licensed under the GPL-2 or later. |  * Licensed under the GPL-2 or later. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #define LOG_CATEGORY UCLASS_SPI_FLASH | ||||||
|  | 
 | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|  | @ -41,6 +43,7 @@ enum sandbox_sf_state { | ||||||
| 	SF_WRITE_STATUS, /* write the flash's status register */ | 	SF_WRITE_STATUS, /* write the flash's status register */ | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | #if CONFIG_IS_ENABLED(LOG) | ||||||
| static const char *sandbox_sf_state_name(enum sandbox_sf_state state) | static const char *sandbox_sf_state_name(enum sandbox_sf_state state) | ||||||
| { | { | ||||||
| 	static const char * const states[] = { | 	static const char * const states[] = { | ||||||
|  | @ -49,6 +52,7 @@ static const char *sandbox_sf_state_name(enum sandbox_sf_state state) | ||||||
| 	}; | 	}; | ||||||
| 	return states[state]; | 	return states[state]; | ||||||
| } | } | ||||||
|  | #endif /* LOG */ | ||||||
| 
 | 
 | ||||||
| /* Bits for the status register */ | /* Bits for the status register */ | ||||||
| #define STAT_WIP	(1 << 0) | #define STAT_WIP	(1 << 0) | ||||||
|  | @ -191,7 +195,7 @@ static void sandbox_sf_cs_activate(struct udevice *dev) | ||||||
| { | { | ||||||
| 	struct sandbox_spi_flash *sbsf = dev_get_priv(dev); | 	struct sandbox_spi_flash *sbsf = dev_get_priv(dev); | ||||||
| 
 | 
 | ||||||
| 	debug("sandbox_sf: CS activated; state is fresh!\n"); | 	log_content("sandbox_sf: CS activated; state is fresh!\n"); | ||||||
| 
 | 
 | ||||||
| 	/* CS is asserted, so reset state */ | 	/* CS is asserted, so reset state */ | ||||||
| 	sbsf->off = 0; | 	sbsf->off = 0; | ||||||
|  | @ -203,7 +207,7 @@ static void sandbox_sf_cs_activate(struct udevice *dev) | ||||||
| 
 | 
 | ||||||
| static void sandbox_sf_cs_deactivate(struct udevice *dev) | static void sandbox_sf_cs_deactivate(struct udevice *dev) | ||||||
| { | { | ||||||
| 	debug("sandbox_sf: CS deactivated; cmd done processing!\n"); | 	log_content("sandbox_sf: CS deactivated; cmd done processing!\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | @ -279,8 +283,8 @@ static int sandbox_sf_process_cmd(struct sandbox_spi_flash *sbsf, const u8 *rx, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (oldstate != sbsf->state) | 	if (oldstate != sbsf->state) | ||||||
| 		debug(" cmd: transition to %s state\n", | 		log_content(" cmd: transition to %s state\n", | ||||||
| 		      sandbox_sf_state_name(sbsf->state)); | 			    sandbox_sf_state_name(sbsf->state)); | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -311,8 +315,8 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 	int bytes = bitlen / 8; | 	int bytes = bitlen / 8; | ||||||
| 	int ret; | 	int ret; | ||||||
| 
 | 
 | ||||||
| 	debug("sandbox_sf: state:%x(%s) bytes:%u\n", sbsf->state, | 	log_content("sandbox_sf: state:%x(%s) bytes:%u\n", sbsf->state, | ||||||
| 	      sandbox_sf_state_name(sbsf->state), bytes); | 		    sandbox_sf_state_name(sbsf->state), bytes); | ||||||
| 
 | 
 | ||||||
| 	if ((flags & SPI_XFER_BEGIN)) | 	if ((flags & SPI_XFER_BEGIN)) | ||||||
| 		sandbox_sf_cs_activate(dev); | 		sandbox_sf_cs_activate(dev); | ||||||
|  | @ -331,7 +335,7 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 		case SF_ID: { | 		case SF_ID: { | ||||||
| 			u8 id; | 			u8 id; | ||||||
| 
 | 
 | ||||||
| 			debug(" id: off:%u tx:", sbsf->off); | 			log_content(" id: off:%u tx:", sbsf->off); | ||||||
| 			if (sbsf->off < IDCODE_LEN) { | 			if (sbsf->off < IDCODE_LEN) { | ||||||
| 				/* Extract correct byte from ID 0x00aabbcc */ | 				/* Extract correct byte from ID 0x00aabbcc */ | ||||||
| 				id = ((JEDEC_MFR(sbsf->data) << 16) | | 				id = ((JEDEC_MFR(sbsf->data) << 16) | | ||||||
|  | @ -340,18 +344,18 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 			} else { | 			} else { | ||||||
| 				id = 0; | 				id = 0; | ||||||
| 			} | 			} | ||||||
| 			debug("%d %02x\n", sbsf->off, id); | 			log_content("%d %02x\n", sbsf->off, id); | ||||||
| 			tx[pos++] = id; | 			tx[pos++] = id; | ||||||
| 			++sbsf->off; | 			++sbsf->off; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		case SF_ADDR: | 		case SF_ADDR: | ||||||
| 			debug(" addr: bytes:%u rx:%02x ", sbsf->addr_bytes, | 			log_content(" addr: bytes:%u rx:%02x ", | ||||||
| 			      rx[pos]); | 				    sbsf->addr_bytes, rx[pos]); | ||||||
| 
 | 
 | ||||||
| 			if (sbsf->addr_bytes++ < SF_ADDR_LEN) | 			if (sbsf->addr_bytes++ < SF_ADDR_LEN) | ||||||
| 				sbsf->off = (sbsf->off << 8) | rx[pos]; | 				sbsf->off = (sbsf->off << 8) | rx[pos]; | ||||||
| 			debug("addr:%06x\n", sbsf->off); | 			log_content("addr:%06x\n", sbsf->off); | ||||||
| 
 | 
 | ||||||
| 			if (tx) | 			if (tx) | ||||||
| 				sandbox_spi_tristate(&tx[pos], 1); | 				sandbox_spi_tristate(&tx[pos], 1); | ||||||
|  | @ -380,8 +384,8 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 				sbsf->state = SF_ERASE; | 				sbsf->state = SF_ERASE; | ||||||
| 				goto case_sf_erase; | 				goto case_sf_erase; | ||||||
| 			} | 			} | ||||||
| 			debug(" cmd: transition to %s state\n", | 			log_content(" cmd: transition to %s state\n", | ||||||
| 			      sandbox_sf_state_name(sbsf->state)); | 				    sandbox_sf_state_name(sbsf->state)); | ||||||
| 			break; | 			break; | ||||||
| 		case SF_READ: | 		case SF_READ: | ||||||
| 			/*
 | 			/*
 | ||||||
|  | @ -390,7 +394,7 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 			 */ | 			 */ | ||||||
| 
 | 
 | ||||||
| 			cnt = bytes - pos; | 			cnt = bytes - pos; | ||||||
| 			debug(" tx: read(%u)\n", cnt); | 			log_content(" tx: read(%u)\n", cnt); | ||||||
| 			assert(tx); | 			assert(tx); | ||||||
| 			ret = os_read(sbsf->fd, tx + pos, cnt); | 			ret = os_read(sbsf->fd, tx + pos, cnt); | ||||||
| 			if (ret < 0) { | 			if (ret < 0) { | ||||||
|  | @ -400,19 +404,19 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 			pos += ret; | 			pos += ret; | ||||||
| 			break; | 			break; | ||||||
| 		case SF_READ_STATUS: | 		case SF_READ_STATUS: | ||||||
| 			debug(" read status: %#x\n", sbsf->status); | 			log_content(" read status: %#x\n", sbsf->status); | ||||||
| 			cnt = bytes - pos; | 			cnt = bytes - pos; | ||||||
| 			memset(tx + pos, sbsf->status, cnt); | 			memset(tx + pos, sbsf->status, cnt); | ||||||
| 			pos += cnt; | 			pos += cnt; | ||||||
| 			break; | 			break; | ||||||
| 		case SF_READ_STATUS1: | 		case SF_READ_STATUS1: | ||||||
| 			debug(" read status: %#x\n", sbsf->status); | 			log_content(" read status: %#x\n", sbsf->status); | ||||||
| 			cnt = bytes - pos; | 			cnt = bytes - pos; | ||||||
| 			memset(tx + pos, sbsf->status >> 8, cnt); | 			memset(tx + pos, sbsf->status >> 8, cnt); | ||||||
| 			pos += cnt; | 			pos += cnt; | ||||||
| 			break; | 			break; | ||||||
| 		case SF_WRITE_STATUS: | 		case SF_WRITE_STATUS: | ||||||
| 			debug(" write status: %#x (ignored)\n", rx[pos]); | 			log_content(" write status: %#x (ignored)\n", rx[pos]); | ||||||
| 			pos = bytes; | 			pos = bytes; | ||||||
| 			break; | 			break; | ||||||
| 		case SF_WRITE: | 		case SF_WRITE: | ||||||
|  | @ -428,7 +432,7 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			cnt = bytes - pos; | 			cnt = bytes - pos; | ||||||
| 			debug(" rx: write(%u)\n", cnt); | 			log_content(" rx: write(%u)\n", cnt); | ||||||
| 			if (tx) | 			if (tx) | ||||||
| 				sandbox_spi_tristate(&tx[pos], cnt); | 				sandbox_spi_tristate(&tx[pos], cnt); | ||||||
| 			ret = os_write(sbsf->fd, rx + pos, cnt); | 			ret = os_write(sbsf->fd, rx + pos, cnt); | ||||||
|  | @ -448,15 +452,15 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 
 | 
 | ||||||
| 			/* verify address is aligned */ | 			/* verify address is aligned */ | ||||||
| 			if (sbsf->off & (sbsf->erase_size - 1)) { | 			if (sbsf->off & (sbsf->erase_size - 1)) { | ||||||
| 				debug(" sector erase: cmd:%#x needs align:%#x, but we got %#x\n", | 				log_content(" sector erase: cmd:%#x needs align:%#x, but we got %#x\n", | ||||||
| 				      sbsf->cmd, sbsf->erase_size, | 					    sbsf->cmd, sbsf->erase_size, | ||||||
| 				      sbsf->off); | 					    sbsf->off); | ||||||
| 				sbsf->status &= ~STAT_WEL; | 				sbsf->status &= ~STAT_WEL; | ||||||
| 				goto done; | 				goto done; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			debug(" sector erase addr: %u, size: %u\n", sbsf->off, | 			log_content(" sector erase addr: %u, size: %u\n", | ||||||
| 			      sbsf->erase_size); | 				    sbsf->off, sbsf->erase_size); | ||||||
| 
 | 
 | ||||||
| 			cnt = bytes - pos; | 			cnt = bytes - pos; | ||||||
| 			if (tx) | 			if (tx) | ||||||
|  | @ -470,13 +474,13 @@ static int sandbox_sf_xfer(struct udevice *dev, unsigned int bitlen, | ||||||
| 			ret = sandbox_erase_part(sbsf, sbsf->erase_size); | 			ret = sandbox_erase_part(sbsf, sbsf->erase_size); | ||||||
| 			sbsf->status &= ~STAT_WEL; | 			sbsf->status &= ~STAT_WEL; | ||||||
| 			if (ret) { | 			if (ret) { | ||||||
| 				debug("sandbox_sf: Erase failed\n"); | 				log_content("sandbox_sf: Erase failed\n"); | ||||||
| 				goto done; | 				goto done; | ||||||
| 			} | 			} | ||||||
| 			goto done; | 			goto done; | ||||||
| 		} | 		} | ||||||
| 		default: | 		default: | ||||||
| 			debug(" ??? no idea what to do ???\n"); | 			log_content(" ??? no idea what to do ???\n"); | ||||||
| 			goto done; | 			goto done; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -8,6 +8,8 @@ | ||||||
|  * Licensed under the GPL-2 or later. |  * Licensed under the GPL-2 or later. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #define LOG_CATEGORY UCLASS_SPI | ||||||
|  | 
 | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <malloc.h> | #include <malloc.h> | ||||||
|  | @ -56,7 +58,6 @@ static int sandbox_spi_xfer(struct udevice *slave, unsigned int bitlen, | ||||||
| 	struct udevice *emul; | 	struct udevice *emul; | ||||||
| 	uint bytes = bitlen / 8, i; | 	uint bytes = bitlen / 8, i; | ||||||
| 	int ret; | 	int ret; | ||||||
| 	u8 *tx = (void *)dout, *rx = din; |  | ||||||
| 	uint busnum, cs; | 	uint busnum, cs; | ||||||
| 
 | 
 | ||||||
| 	if (bitlen == 0) | 	if (bitlen == 0) | ||||||
|  | @ -87,37 +88,16 @@ static int sandbox_spi_xfer(struct udevice *slave, unsigned int bitlen, | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return ret; | 		return ret; | ||||||
| 
 | 
 | ||||||
| 	/* make sure rx/tx buffers are full so clients can assume */ |  | ||||||
| 	if (!tx) { |  | ||||||
| 		debug("sandbox_spi: xfer: auto-allocating tx scratch buffer\n"); |  | ||||||
| 		tx = malloc(bytes); |  | ||||||
| 		if (!tx) { |  | ||||||
| 			debug("sandbox_spi: Out of memory\n"); |  | ||||||
| 			return -ENOMEM; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if (!rx) { |  | ||||||
| 		debug("sandbox_spi: xfer: auto-allocating rx scratch buffer\n"); |  | ||||||
| 		rx = malloc(bytes); |  | ||||||
| 		if (!rx) { |  | ||||||
| 			debug("sandbox_spi: Out of memory\n"); |  | ||||||
| 			return -ENOMEM; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	ops = spi_emul_get_ops(emul); | 	ops = spi_emul_get_ops(emul); | ||||||
| 	ret = ops->xfer(emul, bitlen, dout, din, flags); | 	ret = ops->xfer(emul, bitlen, dout, din, flags); | ||||||
| 
 | 
 | ||||||
| 	debug("sandbox_spi: xfer: got back %i (that's %s)\n rx:", | 	log_content("sandbox_spi: xfer: got back %i (that's %s)\n rx:", | ||||||
| 	      ret, ret ? "bad" : "good"); | 		    ret, ret ? "bad" : "good"); | ||||||
| 	for (i = 0; i < bytes; ++i) | 	if (din) { | ||||||
| 		debug(" %u:%02x", i, rx[i]); | 		for (i = 0; i < bytes; ++i) | ||||||
| 	debug("\n"); | 			log_content(" %u:%02x", i, ((u8 *)din)[i]); | ||||||
| 
 | 	} | ||||||
| 	if (tx != dout) | 	log_content("\n"); | ||||||
| 		free(tx); |  | ||||||
| 	if (rx != din) |  | ||||||
| 		free(rx); |  | ||||||
| 
 | 
 | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ enum log_category_t { | ||||||
| 	LOGC_DM,	/* Core driver-model */ | 	LOGC_DM,	/* Core driver-model */ | ||||||
| 	LOGC_DT,	/* Device-tree */ | 	LOGC_DT,	/* Device-tree */ | ||||||
| 	LOGC_EFI,	/* EFI implementation */ | 	LOGC_EFI,	/* EFI implementation */ | ||||||
|  | 	LOGC_ALLOC,	/* Memory allocation */ | ||||||
| 
 | 
 | ||||||
| 	LOGC_COUNT, | 	LOGC_COUNT, | ||||||
| 	LOGC_END, | 	LOGC_END, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue