spi: bcm63xx-hsspi: Disable spi mem dual io read op support
[linux-2.6-microblaze.git] / drivers / spi / spi-bcm63xx-hsspi.c
index 6a289de..1e9e906 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/spi/spi.h>
 #include <linux/mutex.h>
 #include <linux/of.h>
+#include <linux/spi/spi-mem.h>
+#include <linux/mtd/spi-nor.h>
 #include <linux/reset.h>
 #include <linux/pm_runtime.h>
 
@@ -682,6 +684,26 @@ static int bcm63xx_hsspi_transfer_one(struct spi_master *master,
        return 0;
 }
 
+static bool bcm63xx_hsspi_mem_supports_op(struct spi_mem *mem,
+                           const struct spi_mem_op *op)
+{
+       if (!spi_mem_default_supports_op(mem, op))
+               return false;
+
+       /* Controller doesn't support spi mem dual io mode */
+       if ((op->cmd.opcode == SPINOR_OP_READ_1_2_2) ||
+               (op->cmd.opcode == SPINOR_OP_READ_1_2_2_4B) ||
+               (op->cmd.opcode == SPINOR_OP_READ_1_2_2_DTR) ||
+               (op->cmd.opcode == SPINOR_OP_READ_1_2_2_DTR_4B))
+               return false;
+
+       return true;
+}
+
+static const struct spi_controller_mem_ops bcm63xx_hsspi_mem_ops = {
+       .supports_op = bcm63xx_hsspi_mem_supports_op,
+};
+
 static irqreturn_t bcm63xx_hsspi_interrupt(int irq, void *dev_id)
 {
        struct bcm63xx_hsspi *bs = (struct bcm63xx_hsspi *)dev_id;
@@ -779,6 +801,7 @@ static int bcm63xx_hsspi_probe(struct platform_device *pdev)
        mutex_init(&bs->msg_mutex);
        init_completion(&bs->done);
 
+       master->mem_ops = &bcm63xx_hsspi_mem_ops;
        master->dev.of_node = dev->of_node;
        if (!dev->of_node)
                master->bus_num = HSSPI_BUS_NUM;