summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorApurva Nandan <a-nandan@ti.com>2023-01-23 23:13:21 +0530
committerPraneeth Bajjuri <praneeth@ti.com>2023-01-25 14:10:19 -0600
commitab9dd1b9846216d3fc703c19963897c7894ff4d5 (patch)
treeae4299dbd081fe7f9764cbd6c40934ddd7427e7c /drivers
parent1e0d0aebe707477c954d30cc225d2f4d184b1bb8 (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.c36
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