diff options
author | Apurva Nandan <a-nandan@ti.com> | 2023-01-23 23:13:21 +0530 |
---|---|---|
committer | Praneeth Bajjuri <praneeth@ti.com> | 2023-01-25 14:10:19 -0600 |
commit | ab9dd1b9846216d3fc703c19963897c7894ff4d5 (patch) | |
tree | ae4299dbd081fe7f9764cbd6c40934ddd7427e7c /drivers | |
parent | 1e0d0aebe707477c954d30cc225d2f4d184b1bb8 (diff) |
mtd: spinand: Add support for manufacturer-based ctrl_ops variations
Add ctrl_ops_variants, which can be used by the manufacturers' codes
to define their SPI control operation variants. Add a macro to easily
define ctrl_ops_varinats. This can be used to list out all the
supported ctrl ops with their respective protocols by the vendors.
Add spinand_select_ctrl_ops_variant() helper function to search for
a supported ctrl_ops variant with the required SPI protocol in a given
list of variants.
Signed-off-by: Apurva Nandan <a-nandan@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/nand/spi/core.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c index 0767250085..2b9d9215fa 100644 --- a/drivers/mtd/nand/spi/core.c +++ b/drivers/mtd/nand/spi/core.c @@ -914,6 +914,42 @@ spinand_select_data_op_variant(struct spinand_device *spinand, return NULL; } +static const struct spinand_ctrl_ops * +spinand_select_ctrl_ops_variant(struct spinand_device *spinand, + const struct spinand_ctrl_ops_variants *variants, + const enum spinand_protocol protocol) +{ + unsigned int i; + + for (i = 0; i < variants->nvariants; i++) { + const struct spinand_ctrl_ops *ctrl_ops = + &variants->ctrl_ops_list[i]; + + if (ctrl_ops->protocol != protocol) + continue; + + if (!spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.reset) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.get_feature) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.set_feature) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.write_enable) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.block_erase) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.page_read) || + !spi_mem_supports_op(spinand->slave, + &ctrl_ops->ops.program_execute)) + continue; + + return ctrl_ops; + } + + return NULL; +} + /** * spinand_match_and_init() - Try to find a match between a device ID and an * entry in a spinand_info table |