mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 07:31:29 +00:00
spi: differentiate between unsupported and invalid
Merge series from Miquel Raynal <miquel.raynal@bootlin.com>: I am working on spi-nand continuous read support, which lead me to check what spi controllers were capable of. >From a caller (and reviewer) point of view, distinguishing between error cases has been proven useful, especially between two conditions: - the request is totally unsupported and will never work - the request is typically out of range somehow but a subsequent call with corrected parameters might work So while I was statically reading the various drivers, I attempted to clarify these situations and thought it might be nice to have this upstream as well. As ENOTSUPP is not a SUSV4 code and previous series have already been merged to reduce its use, I also converted these few cases to EOPNOTSUP instead, but if anybody doesn't like these changes, it can be dropped.
This commit is contained in:
commit
b0d8c563f0
@ -55,13 +55,15 @@ static int dw_spi_bt1_dirmap_create(struct spi_mem_dirmap_desc *desc)
|
||||
!dwsbt1->dws.mem_ops.supports_op(desc->mem, &desc->info.op_tmpl))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/*
|
||||
* Make sure the requested region doesn't go out of the physically
|
||||
* mapped flash memory bounds and the operation is read-only.
|
||||
* mapped flash memory bounds.
|
||||
*/
|
||||
if (desc->info.offset + desc->info.length > dwsbt1->map_len ||
|
||||
desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
|
||||
return -EOPNOTSUPP;
|
||||
if (desc->info.offset + desc->info.length > dwsbt1->map_len)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -496,7 +496,7 @@ static int mxic_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
|
||||
struct mxic_spi *mxic = spi_controller_get_devdata(desc->mem->spi->controller);
|
||||
|
||||
if (!mxic->linear.map)
|
||||
return -EINVAL;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (desc->info.offset + desc->info.length > U32_MAX)
|
||||
return -EINVAL;
|
||||
|
@ -95,16 +95,16 @@ static int rpcif_spi_mem_dirmap_create(struct spi_mem_dirmap_desc *desc)
|
||||
spi_controller_get_devdata(desc->mem->spi->controller);
|
||||
|
||||
if (desc->info.offset + desc->info.length > U32_MAX)
|
||||
return -ENOTSUPP;
|
||||
return -EINVAL;
|
||||
|
||||
if (!rpcif_spi_mem_supports_op(desc->mem, &desc->info.op_tmpl))
|
||||
return -ENOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!rpc->dirmap && desc->info.op_tmpl.data.dir == SPI_MEM_DATA_IN)
|
||||
return -ENOTSUPP;
|
||||
if (!rpc->dirmap)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (desc->info.op_tmpl.data.dir == SPI_MEM_DATA_OUT)
|
||||
return -ENOTSUPP;
|
||||
if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -378,7 +378,7 @@ static int wpcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
|
||||
int cs = spi_get_chipselect(desc->mem->spi, 0);
|
||||
|
||||
if (desc->info.op_tmpl.data.dir != SPI_MEM_DATA_IN)
|
||||
return -ENOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/*
|
||||
* Unfortunately, FIU only supports a 16 MiB direct mapping window (per
|
||||
@ -387,11 +387,11 @@ static int wpcm_fiu_dirmap_create(struct spi_mem_dirmap_desc *desc)
|
||||
* flashes that are bigger than 16 MiB.
|
||||
*/
|
||||
if (desc->info.offset + desc->info.length > MAX_MEMORY_SIZE_PER_CS)
|
||||
return -ENOTSUPP;
|
||||
return -EINVAL;
|
||||
|
||||
/* Don't read past the memory window */
|
||||
if (cs * MAX_MEMORY_SIZE_PER_CS + desc->info.offset + desc->info.length > fiu->memory_size)
|
||||
return -ENOTSUPP;
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user