diff options
| -rw-r--r-- | drivers/mtd/spi/spi-nor-core.c | 23 | ||||
| -rw-r--r-- | drivers/mtd/spi/spi-nor-ids.c | 1 | ||||
| -rw-r--r-- | drivers/spi/spi-mem-nodm.c | 10 | 
3 files changed, 24 insertions, 10 deletions
| diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c index 99e2f16349a..d5d905fa5a1 100644 --- a/drivers/mtd/spi/spi-nor-core.c +++ b/drivers/mtd/spi/spi-nor-core.c @@ -2604,18 +2604,28 @@ static int spi_nor_init_params(struct spi_nor *nor,  	params->size = info->sector_size * info->n_sectors;  	params->page_size = info->page_size; +	if (!(info->flags & SPI_NOR_NO_FR)) { +		/* Default to Fast Read for DT and non-DT platform devices. */ +		params->hwcaps.mask |= SNOR_HWCAPS_READ_FAST; + +		/* Mask out Fast Read if not requested at DT instantiation. */ +#if CONFIG_IS_ENABLED(DM_SPI) +		if (!ofnode_read_bool(dev_ofnode(nor->spi->dev), +				      "m25p,fast-read")) +			params->hwcaps.mask &= ~SNOR_HWCAPS_READ_FAST; +#endif +	} +  	/* (Fast) Read settings. */  	params->hwcaps.mask |= SNOR_HWCAPS_READ;  	spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ],  				  0, 0, SPINOR_OP_READ,  				  SNOR_PROTO_1_1_1); -	if (!(info->flags & SPI_NOR_NO_FR)) { -		params->hwcaps.mask |= SNOR_HWCAPS_READ_FAST; +	if (params->hwcaps.mask & SNOR_HWCAPS_READ_FAST)  		spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_FAST],  					  0, 8, SPINOR_OP_READ_FAST,  					  SNOR_PROTO_1_1_1); -	}  	if (info->flags & SPI_NOR_DUAL_READ) {  		params->hwcaps.mask |= SNOR_HWCAPS_READ_1_1_2; @@ -2858,10 +2868,11 @@ spi_nor_adjust_hwcaps(struct spi_nor *nor,  	unsigned int cap;  	/* -	 * Enable all caps by default. We will mask them after checking what's -	 * really supported using spi_mem_supports_op(). +	 * Start by assuming the controller supports every capability. +	 * We will mask them after checking what's really supported +	 * using spi_mem_supports_op().  	 */ -	*hwcaps = SNOR_HWCAPS_ALL; +	*hwcaps = SNOR_HWCAPS_ALL & params->hwcaps.mask;  	/* X-X-X modes are not supported yet, mask them all. */  	*hwcaps &= ~SNOR_HWCAPS_X_X_X; diff --git a/drivers/mtd/spi/spi-nor-ids.c b/drivers/mtd/spi/spi-nor-ids.c index 6f84c54a474..cb3a08872d6 100644 --- a/drivers/mtd/spi/spi-nor-ids.c +++ b/drivers/mtd/spi/spi-nor-ids.c @@ -359,6 +359,7 @@ const struct flash_info spi_nor_ids[] = {  #ifdef CONFIG_SPI_FLASH_XMC  	/* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */  	{ INFO("XM25QH64A", 0x207017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, +	{ INFO("XM25QH64C", 0x204017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },  	{ INFO("XM25QH128A", 0x207018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },  #endif  	{ }, diff --git a/drivers/spi/spi-mem-nodm.c b/drivers/spi/spi-mem-nodm.c index a228c808c74..77ddb19a9f3 100644 --- a/drivers/spi/spi-mem-nodm.c +++ b/drivers/spi/spi-mem-nodm.c @@ -93,12 +93,14 @@ int spi_mem_adjust_op_size(struct spi_slave *slave,  	if (slave->max_write_size && len > slave->max_write_size)  		return -EINVAL; -	if (op->data.dir == SPI_MEM_DATA_IN && slave->max_read_size) -		op->data.nbytes = min(op->data.nbytes, -				      slave->max_read_size); -	else if (slave->max_write_size) +	if (op->data.dir == SPI_MEM_DATA_IN) { +		if (slave->max_read_size) +			op->data.nbytes = min(op->data.nbytes, +					      slave->max_read_size); +	} else if (slave->max_write_size) {  		op->data.nbytes = min(op->data.nbytes,  				      slave->max_write_size - len); +	}  	if (!op->data.nbytes)  		return -EINVAL; | 
