Commit d00c50b3 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'spi-fix-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
 "A small collection of fixes that have arrived since the merge window,
  the most noticable one is a fix for unmapping messages when the
  mapping was done with the struct device supplied to do the mapping
  overridden"

* tag 'spi-fix-v5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: bcm-qspi: fix MSPI only access with bcm_qspi_exec_mem_op()
  spi: cadence-quadspi: fix protocol setup for non-1-1-X operations
  spi: core: add dma_map_dev for __spi_unmap_msg()
  spi: mxic: Fix an error handling path in mxic_spi_probe()
  spi: rpc-if: Fix RPM imbalance in probe error path
parents 98849765 2c7d1b28
...@@ -1205,7 +1205,7 @@ static int bcm_qspi_exec_mem_op(struct spi_mem *mem, ...@@ -1205,7 +1205,7 @@ static int bcm_qspi_exec_mem_op(struct spi_mem *mem,
addr = op->addr.val; addr = op->addr.val;
len = op->data.nbytes; len = op->data.nbytes;
if (bcm_qspi_bspi_ver_three(qspi) == true) { if (has_bspi(qspi) && bcm_qspi_bspi_ver_three(qspi) == true) {
/* /*
* The address coming into this function is a raw flash offset. * The address coming into this function is a raw flash offset.
* But for BSPI <= V3, we need to convert it to a remapped BSPI * But for BSPI <= V3, we need to convert it to a remapped BSPI
...@@ -1224,7 +1224,7 @@ static int bcm_qspi_exec_mem_op(struct spi_mem *mem, ...@@ -1224,7 +1224,7 @@ static int bcm_qspi_exec_mem_op(struct spi_mem *mem,
len < 4) len < 4)
mspi_read = true; mspi_read = true;
if (mspi_read) if (!has_bspi(qspi) || mspi_read)
return bcm_qspi_mspi_exec_mem_op(spi, op); return bcm_qspi_mspi_exec_mem_op(spi, op);
ret = bcm_qspi_bspi_set_mode(qspi, op, 0); ret = bcm_qspi_bspi_set_mode(qspi, op, 0);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/log2.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of.h> #include <linux/of.h>
...@@ -102,12 +103,6 @@ struct cqspi_driver_platdata { ...@@ -102,12 +103,6 @@ struct cqspi_driver_platdata {
#define CQSPI_TIMEOUT_MS 500 #define CQSPI_TIMEOUT_MS 500
#define CQSPI_READ_TIMEOUT_MS 10 #define CQSPI_READ_TIMEOUT_MS 10
/* Instruction type */
#define CQSPI_INST_TYPE_SINGLE 0
#define CQSPI_INST_TYPE_DUAL 1
#define CQSPI_INST_TYPE_QUAD 2
#define CQSPI_INST_TYPE_OCTAL 3
#define CQSPI_DUMMY_CLKS_PER_BYTE 8 #define CQSPI_DUMMY_CLKS_PER_BYTE 8
#define CQSPI_DUMMY_BYTES_MAX 4 #define CQSPI_DUMMY_BYTES_MAX 4
#define CQSPI_DUMMY_CLKS_MAX 31 #define CQSPI_DUMMY_CLKS_MAX 31
...@@ -376,10 +371,6 @@ static unsigned int cqspi_calc_dummy(const struct spi_mem_op *op, bool dtr) ...@@ -376,10 +371,6 @@ static unsigned int cqspi_calc_dummy(const struct spi_mem_op *op, bool dtr)
static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata, static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata,
const struct spi_mem_op *op) const struct spi_mem_op *op)
{ {
f_pdata->inst_width = CQSPI_INST_TYPE_SINGLE;
f_pdata->addr_width = CQSPI_INST_TYPE_SINGLE;
f_pdata->data_width = CQSPI_INST_TYPE_SINGLE;
/* /*
* For an op to be DTR, cmd phase along with every other non-empty * For an op to be DTR, cmd phase along with every other non-empty
* phase should have dtr field set to 1. If an op phase has zero * phase should have dtr field set to 1. If an op phase has zero
...@@ -389,32 +380,23 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata, ...@@ -389,32 +380,23 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata,
(!op->addr.nbytes || op->addr.dtr) && (!op->addr.nbytes || op->addr.dtr) &&
(!op->data.nbytes || op->data.dtr); (!op->data.nbytes || op->data.dtr);
switch (op->data.buswidth) { f_pdata->inst_width = 0;
case 0: if (op->cmd.buswidth)
break; f_pdata->inst_width = ilog2(op->cmd.buswidth);
case 1:
f_pdata->data_width = CQSPI_INST_TYPE_SINGLE; f_pdata->addr_width = 0;
break; if (op->addr.buswidth)
case 2: f_pdata->addr_width = ilog2(op->addr.buswidth);
f_pdata->data_width = CQSPI_INST_TYPE_DUAL;
break; f_pdata->data_width = 0;
case 4: if (op->data.buswidth)
f_pdata->data_width = CQSPI_INST_TYPE_QUAD; f_pdata->data_width = ilog2(op->data.buswidth);
break;
case 8:
f_pdata->data_width = CQSPI_INST_TYPE_OCTAL;
break;
default:
return -EINVAL;
}
/* Right now we only support 8-8-8 DTR mode. */ /* Right now we only support 8-8-8 DTR mode. */
if (f_pdata->dtr) { if (f_pdata->dtr) {
switch (op->cmd.buswidth) { switch (op->cmd.buswidth) {
case 0: case 0:
break;
case 8: case 8:
f_pdata->inst_width = CQSPI_INST_TYPE_OCTAL;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -422,9 +404,7 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata, ...@@ -422,9 +404,7 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata,
switch (op->addr.buswidth) { switch (op->addr.buswidth) {
case 0: case 0:
break;
case 8: case 8:
f_pdata->addr_width = CQSPI_INST_TYPE_OCTAL;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -432,9 +412,7 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata, ...@@ -432,9 +412,7 @@ static int cqspi_set_protocol(struct cqspi_flash_pdata *f_pdata,
switch (op->data.buswidth) { switch (op->data.buswidth) {
case 0: case 0:
break;
case 8: case 8:
f_pdata->data_width = CQSPI_INST_TYPE_OCTAL;
break; break;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -813,6 +813,7 @@ static int mxic_spi_probe(struct platform_device *pdev) ...@@ -813,6 +813,7 @@ static int mxic_spi_probe(struct platform_device *pdev)
if (ret) { if (ret) {
dev_err(&pdev->dev, "spi_register_master failed\n"); dev_err(&pdev->dev, "spi_register_master failed\n");
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
mxic_spi_mem_ecc_remove(mxic);
} }
return ret; return ret;
......
...@@ -158,14 +158,18 @@ static int rpcif_spi_probe(struct platform_device *pdev) ...@@ -158,14 +158,18 @@ static int rpcif_spi_probe(struct platform_device *pdev)
error = rpcif_hw_init(rpc, false); error = rpcif_hw_init(rpc, false);
if (error) if (error)
return error; goto out_disable_rpm;
error = spi_register_controller(ctlr); error = spi_register_controller(ctlr);
if (error) { if (error) {
dev_err(&pdev->dev, "spi_register_controller failed\n"); dev_err(&pdev->dev, "spi_register_controller failed\n");
rpcif_disable_rpm(rpc); goto out_disable_rpm;
} }
return 0;
out_disable_rpm:
rpcif_disable_rpm(rpc);
return error; return error;
} }
......
...@@ -1130,11 +1130,15 @@ static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg) ...@@ -1130,11 +1130,15 @@ static int __spi_unmap_msg(struct spi_controller *ctlr, struct spi_message *msg)
if (ctlr->dma_tx) if (ctlr->dma_tx)
tx_dev = ctlr->dma_tx->device->dev; tx_dev = ctlr->dma_tx->device->dev;
else if (ctlr->dma_map_dev)
tx_dev = ctlr->dma_map_dev;
else else
tx_dev = ctlr->dev.parent; tx_dev = ctlr->dev.parent;
if (ctlr->dma_rx) if (ctlr->dma_rx)
rx_dev = ctlr->dma_rx->device->dev; rx_dev = ctlr->dma_rx->device->dev;
else if (ctlr->dma_map_dev)
rx_dev = ctlr->dma_map_dev;
else else
rx_dev = ctlr->dev.parent; rx_dev = ctlr->dev.parent;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment