* [PATCH 01/23] spi: fsl-espi: dont include irq.h
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2016-08-25 4:43 ` Heiner Kallweit
[not found] ` <3a4b4e11-9283-5d52-d125-66c7565913d4-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:44 ` [PATCH 03/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
` (68 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:43 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
irq.h isn't needed and it even shouldn't be included, see comment
at the beginning of this header file.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 96a2442..d95fdd0 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -12,7 +12,6 @@
#include <linux/err.h>
#include <linux/fsl_devices.h>
#include <linux/interrupt.h>
-#include <linux/irq.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/of.h>
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 03/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:43 ` [PATCH 01/23] spi: fsl-espi: dont include irq.h Heiner Kallweit
@ 2016-08-25 4:44 ` Heiner Kallweit
[not found] ` <b5777cc4-1ab7-d7cb-00be-c597060e7af6-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:44 ` [PATCH 04/23] spi: fsl-espi: change return type of fsl_espi_setup_transfer to void Heiner Kallweit
` (67 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:44 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Both elements are not used, so remove them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 2c4b2f8..12cb0c5 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,8 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned n_tx;
- unsigned n_rx;
unsigned actual_length;
int status;
};
@@ -372,26 +370,18 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct mpc8xxx_spi *mspi = spi_master_get_devdata(master);
struct spi_transfer *t;
u8 *rx_buf = NULL;
- unsigned int n_tx = 0;
- unsigned int n_rx = 0;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
memset(mspi->local_buf, 0, SPCOM_TRANLEN_MAX);
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf)
- n_tx += t->len;
- if (t->rx_buf) {
- n_rx += t->len;
+ if (t->rx_buf)
rx_buf = t->rx_buf;
- }
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
}
- espi_trans.n_tx = n_tx;
- espi_trans.n_rx = n_rx;
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
espi_trans.status = 0;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 04/23] spi: fsl-espi: change return type of fsl_espi_setup_transfer to void
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:43 ` [PATCH 01/23] spi: fsl-espi: dont include irq.h Heiner Kallweit
2016-08-25 4:44 ` [PATCH 03/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
@ 2016-08-25 4:44 ` Heiner Kallweit
[not found] ` <2800693b-704a-5530-2d58-8fd38d33dc10-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:44 ` [PATCH 05/23] spi: fsl-espi: change return type of fsl_espi_cpu_bufs to void Heiner Kallweit
` (66 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:44 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_setup_transfer always returns 0, so change the return type
to void.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 19 ++++---------------
1 file changed, 4 insertions(+), 15 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 12cb0c5..38eced3 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -128,7 +128,7 @@ static u32 fsl_espi_tx_buf_lsb(struct mpc8xxx_spi *mpc8xxx_spi)
return data;
}
-static int fsl_espi_setup_transfer(struct spi_device *spi,
+static void fsl_espi_setup_transfer(struct spi_device *spi,
struct spi_transfer *t)
{
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
@@ -193,7 +193,6 @@ static int fsl_espi_setup_transfer(struct spi_device *spi,
cs->hw_mode |= CSMODE_PM(pm);
fsl_espi_change_mode(spi);
- return 0;
}
static int fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
@@ -290,13 +289,8 @@ static void fsl_espi_do_trans(struct spi_message *m,
spi_message_add_tail(&trans, &message);
list_for_each_entry(t, &message.transfers, transfer_list) {
- if (t->bits_per_word || t->speed_hz) {
- status = -EINVAL;
-
- status = fsl_espi_setup_transfer(spi, t);
- if (status < 0)
- break;
- }
+ if (t->bits_per_word || t->speed_hz)
+ fsl_espi_setup_transfer(spi, t);
if (t->len)
status = fsl_espi_bufs(spi, t);
@@ -401,7 +395,6 @@ static int fsl_espi_setup(struct spi_device *spi)
{
struct mpc8xxx_spi *mpc8xxx_spi;
struct fsl_espi_reg *reg_base;
- int retval;
u32 hw_mode;
u32 loop_mode;
struct spi_mpc8xxx_cs *cs = spi_get_ctldata(spi);
@@ -442,15 +435,11 @@ static int fsl_espi_setup(struct spi_device *spi)
loop_mode |= SPMODE_LOOP;
mpc8xxx_spi_write_reg(®_base->mode, loop_mode);
- retval = fsl_espi_setup_transfer(spi, NULL);
+ fsl_espi_setup_transfer(spi, NULL);
pm_runtime_mark_last_busy(mpc8xxx_spi->dev);
pm_runtime_put_autosuspend(mpc8xxx_spi->dev);
- if (retval < 0) {
- cs->hw_mode = hw_mode; /* Restore settings */
- return retval;
- }
return 0;
}
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 05/23] spi: fsl-espi: change return type of fsl_espi_cpu_bufs to void
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (2 preceding siblings ...)
2016-08-25 4:44 ` [PATCH 04/23] spi: fsl-espi: change return type of fsl_espi_setup_transfer to void Heiner Kallweit
@ 2016-08-25 4:44 ` Heiner Kallweit
[not found] ` <40dcd903-fdae-6669-5c35-af4b9e9e953b-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:45 ` [PATCH 06/23] spi: fsl-espi: add missing static declaration to fsl_espi_cpu_irq Heiner Kallweit
` (65 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:44 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_cpu_bufs always returns 0, so change the return type to void.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 38eced3..cc09ce6 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -195,7 +195,7 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
fsl_espi_change_mode(spi);
}
-static int fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
+static void fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
unsigned int len)
{
u32 word;
@@ -209,8 +209,6 @@ static int fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
/* transmit word */
word = mspi->get_tx(mspi);
mpc8xxx_spi_write_reg(®_base->transmit, word);
-
- return 0;
}
static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
@@ -237,9 +235,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
- ret = fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
- if (ret)
- return ret;
+ fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
/* Won't hang up forever, SPI bus sometimes got lost interrupts... */
ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 06/23] spi: fsl-espi: add missing static declaration to fsl_espi_cpu_irq
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (3 preceding siblings ...)
2016-08-25 4:44 ` [PATCH 05/23] spi: fsl-espi: change return type of fsl_espi_cpu_bufs to void Heiner Kallweit
@ 2016-08-25 4:45 ` Heiner Kallweit
[not found] ` <aa542aba-e5b5-7851-f12b-1cf04b213bcf-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:45 ` [PATCH 07/23] spi: fsl-espi: remove unneeded variable in fsl_espi_do_trans Heiner Kallweit
` (64 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:45 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Add missing static declaration to fsl_espi_cpu_irq.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index cc09ce6..b3c3612 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -447,7 +447,7 @@ static void fsl_espi_cleanup(struct spi_device *spi)
spi_set_ctldata(spi, NULL);
}
-void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
+static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
{
struct fsl_espi_reg *reg_base = mspi->reg_base;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 07/23] spi: fsl-espi: remove unneeded variable in fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (4 preceding siblings ...)
2016-08-25 4:45 ` [PATCH 06/23] spi: fsl-espi: add missing static declaration to fsl_espi_cpu_irq Heiner Kallweit
@ 2016-08-25 4:45 ` Heiner Kallweit
[not found] ` <683bca81-4522-78d7-338f-0e1a137f4f4f-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:46 ` [PATCH 08/23] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
` (63 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:45 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Creating a message, adding one transfer, and then iterating over
all transfers in the message doesn't make sense.
We can simply use the original transfer directly.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 23 ++++++++---------------
1 file changed, 8 insertions(+), 15 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index b3c3612..494a7bf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -256,11 +256,9 @@ static void fsl_espi_do_trans(struct spi_message *m,
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct fsl_espi_transfer *espi_trans = tr;
- struct spi_message message;
struct spi_transfer *t, *first, trans;
int status = 0;
- spi_message_init(&message);
memset(&trans, 0, sizeof(trans));
first = list_first_entry(&m->transfers, struct spi_transfer,
@@ -282,23 +280,18 @@ static void fsl_espi_do_trans(struct spi_message *m,
trans.len = espi_trans->len;
trans.tx_buf = espi_trans->tx_buf;
trans.rx_buf = espi_trans->rx_buf;
- spi_message_add_tail(&trans, &message);
- list_for_each_entry(t, &message.transfers, transfer_list) {
- if (t->bits_per_word || t->speed_hz)
- fsl_espi_setup_transfer(spi, t);
+ if (trans.bits_per_word || trans.speed_hz)
+ fsl_espi_setup_transfer(spi, &trans);
- if (t->len)
- status = fsl_espi_bufs(spi, t);
+ if (trans.len)
+ status = fsl_espi_bufs(spi, &trans);
- if (status) {
- status = -EMSGSIZE;
- break;
- }
+ if (status)
+ status = -EMSGSIZE;
- if (t->delay_usecs)
- udelay(t->delay_usecs);
- }
+ if (trans.delay_usecs)
+ udelay(trans.delay_usecs);
espi_trans->status = status;
fsl_espi_setup_transfer(spi, NULL);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 08/23] spi: fsl-espi: factor out filling the local buffer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (5 preceding siblings ...)
2016-08-25 4:45 ` [PATCH 07/23] spi: fsl-espi: remove unneeded variable in fsl_espi_do_trans Heiner Kallweit
@ 2016-08-25 4:46 ` Heiner Kallweit
[not found] ` <41a045ab-2629-658f-cccd-23f7182a4bc2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:46 ` [PATCH 09/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
` (62 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:46 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by factoring out filling the local buffer.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 45 +++++++++++++++++++++++----------------------
1 file changed, 23 insertions(+), 22 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 494a7bf..c3aa6f0 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -85,6 +85,26 @@ struct fsl_espi_transfer {
#define AUTOSUSPEND_TIMEOUT 2000
+static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ unsigned int tx_only = 0;
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
+
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->tx_buf) {
+ memcpy(buf, t->tx_buf, t->len);
+ if (!t->rx_buf)
+ tx_only += t->len;
+ } else
+ memset(buf, 0, t->len);
+ buf += t->len;
+ }
+
+ return tx_only;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -301,16 +321,9 @@ static void fsl_espi_cmd_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- int i = 0;
struct fsl_espi_transfer *espi_trans = trans;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- }
- }
+ fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = espi_trans->rx_buf = mspi->local_buf;
fsl_espi_do_trans(m, espi_trans);
@@ -322,18 +335,9 @@ static void fsl_espi_rw_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- unsigned int tx_only = 0;
- int i = 0;
+ unsigned int tx_only;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- if (!t->rx_buf)
- tx_only += t->len;
- }
- }
+ tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = trans->rx_buf = mspi->local_buf;
fsl_espi_do_trans(m, trans);
@@ -350,14 +354,11 @@ static void fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(master);
struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
- memset(mspi->local_buf, 0, SPCOM_TRANLEN_MAX);
-
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 09/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (6 preceding siblings ...)
2016-08-25 4:46 ` [PATCH 08/23] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
@ 2016-08-25 4:46 ` Heiner Kallweit
2016-08-25 4:47 ` [PATCH 10/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
` (61 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:46 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Use the return values of the functions in the call chain to transport
status information instead of using an element in struct
fsl_espi_transfer for this.
This is more in line with the general approach how to handle status
information and is one step further to eventually get rid of
struct fsl_espi_transfer completely.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 47 +++++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index c3aa6f0..68bf72a 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -42,7 +42,6 @@ struct fsl_espi_transfer {
void *rx_buf;
unsigned len;
unsigned actual_length;
- int status;
};
/* eSPI Controller mode register definitions */
@@ -270,14 +269,14 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static void fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m,
+ struct fsl_espi_transfer *tr)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct fsl_espi_transfer *espi_trans = tr;
struct spi_transfer *t, *first, trans;
- int status = 0;
+ int ret = 0;
memset(&trans, 0, sizeof(trans));
@@ -286,10 +285,9 @@ static void fsl_espi_do_trans(struct spi_message *m,
list_for_each_entry(t, &m->transfers, transfer_list) {
if ((first->bits_per_word != t->bits_per_word) ||
(first->speed_hz != t->speed_hz)) {
- espi_trans->status = -EINVAL;
dev_err(mspi->dev,
"bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return;
+ return -EINVAL;
}
trans.speed_hz = t->speed_hz;
@@ -305,50 +303,57 @@ static void fsl_espi_do_trans(struct spi_message *m,
fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
- status = fsl_espi_bufs(spi, &trans);
+ ret = fsl_espi_bufs(spi, &trans);
- if (status)
- status = -EMSGSIZE;
+ if (ret)
+ ret = -EMSGSIZE;
if (trans.delay_usecs)
udelay(trans.delay_usecs);
- espi_trans->status = status;
fsl_espi_setup_transfer(spi, NULL);
+
+ return ret;
}
-static void fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_cmd_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct fsl_espi_transfer *espi_trans = trans;
+ int ret;
fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = espi_trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, espi_trans);
+ ret = fsl_espi_do_trans(m, espi_trans);
espi_trans->actual_length = espi_trans->len;
+
+ return ret;
}
-static void fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_rw_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
+ int ret;
tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, trans);
+ ret = fsl_espi_do_trans(m, trans);
- if (!trans->status) {
+ if (!ret) {
/* If there is at least one RX byte then copy it to rx_buff */
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
trans->actual_length += trans->len;
}
+
+ return ret;
}
static int fsl_espi_do_one_msg(struct spi_master *master,
@@ -358,6 +363,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
+ int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
@@ -368,15 +374,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
- espi_trans.status = 0;
if (!rx_buf)
- fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
- fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = espi_trans.status;
+ m->status = ret;
spi_finalize_current_message(master);
return 0;
}
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 10/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (7 preceding siblings ...)
2016-08-25 4:46 ` [PATCH 09/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
@ 2016-08-25 4:47 ` Heiner Kallweit
[not found] ` <212d80f1-e3d1-0065-7366-e509a30b9c6c-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:47 ` [PATCH 11/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
` (60 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:47 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurred during message handling return this error instead
of always returning 0 and align the code with the generic
implementation in spi_transfer_one_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 68bf72a..c15d2bc 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -381,9 +381,12 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = ret;
+ if (m->status == -EINPROGRESS)
+ m->status = ret;
+
spi_finalize_current_message(master);
- return 0;
+
+ return ret;
}
static int fsl_espi_setup(struct spi_device *spi)
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 11/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (8 preceding siblings ...)
2016-08-25 4:47 ` [PATCH 10/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
@ 2016-08-25 4:47 ` Heiner Kallweit
2016-08-25 4:48 ` [PATCH 12/23] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
` (59 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:47 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurs during processing the message, then we don't have
to populate the actual_length element of struct message.
So we can get rid of element actual_length in struct
fsl_espi_transfer.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index c15d2bc..4ff27bf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,7 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned actual_length;
};
/* eSPI Controller mode register definitions */
@@ -328,8 +327,6 @@ static int fsl_espi_cmd_trans(struct spi_message *m,
espi_trans->tx_buf = espi_trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, espi_trans);
- espi_trans->actual_length = espi_trans->len;
-
return ret;
}
@@ -350,7 +347,6 @@ static int fsl_espi_rw_trans(struct spi_message *m,
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
- trans->actual_length += trans->len;
}
return ret;
@@ -373,14 +369,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
}
espi_trans.len = xfer_len;
- espi_trans.actual_length = 0;
if (!rx_buf)
ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
- m->actual_length = espi_trans.actual_length;
+ m->actual_length = ret ? 0 : espi_trans.len;
+
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 12/23] spi: fsl-espi: eliminate struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (9 preceding siblings ...)
2016-08-25 4:47 ` [PATCH 11/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
@ 2016-08-25 4:48 ` Heiner Kallweit
2016-08-25 4:48 ` [PATCH 13/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
` (58 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:48 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
The remaining elements of struct fsl_espi_transfer are part of struct
spi_transfer anyway. So we can get rid of struct fsl_espi_transfer
and use a struct spi_transfer only.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 56 +++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 36 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 4ff27bf..4c36a5d 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -37,12 +37,6 @@ struct fsl_espi_reg {
__be32 csmode[4]; /* 0x020 - 0x02c eSPI cs mode register */
};
-struct fsl_espi_transfer {
- const void *tx_buf;
- void *rx_buf;
- unsigned len;
-};
-
/* eSPI Controller mode register definitions */
#define SPMODE_ENABLE (1 << 31)
#define SPMODE_LOOP (1 << 30)
@@ -268,17 +262,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static int fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
- struct fsl_espi_transfer *espi_trans = tr;
- struct spi_transfer *t, *first, trans;
+ struct spi_transfer *t, *first;
int ret = 0;
- memset(&trans, 0, sizeof(trans));
-
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -289,26 +279,22 @@ static int fsl_espi_do_trans(struct spi_message *m,
return -EINVAL;
}
- trans.speed_hz = t->speed_hz;
- trans.bits_per_word = t->bits_per_word;
- trans.delay_usecs = max(first->delay_usecs, t->delay_usecs);
+ trans->speed_hz = t->speed_hz;
+ trans->bits_per_word = t->bits_per_word;
+ trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- trans.len = espi_trans->len;
- trans.tx_buf = espi_trans->tx_buf;
- trans.rx_buf = espi_trans->rx_buf;
-
- if (trans.bits_per_word || trans.speed_hz)
- fsl_espi_setup_transfer(spi, &trans);
+ if (trans->bits_per_word || trans->speed_hz)
+ fsl_espi_setup_transfer(spi, trans);
- if (trans.len)
- ret = fsl_espi_bufs(spi, &trans);
+ if (trans->len)
+ ret = fsl_espi_bufs(spi, trans);
if (ret)
ret = -EMSGSIZE;
- if (trans.delay_usecs)
- udelay(trans.delay_usecs);
+ if (trans->delay_usecs)
+ udelay(trans->delay_usecs);
fsl_espi_setup_transfer(spi, NULL);
@@ -316,22 +302,21 @@ static int fsl_espi_do_trans(struct spi_message *m,
}
static int fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct fsl_espi_transfer *espi_trans = trans;
int ret;
fsl_espi_copy_to_buf(m, mspi);
- espi_trans->tx_buf = espi_trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, espi_trans);
+ trans->tx_buf = trans->rx_buf = mspi->local_buf;
+ ret = fsl_espi_do_trans(m, trans);
return ret;
}
static int fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -355,10 +340,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
- struct fsl_espi_transfer espi_trans;
+ struct spi_transfer *t, trans = {};
int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -368,14 +352,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
xfer_len += t->len;
}
- espi_trans.len = xfer_len;
+ trans.len = xfer_len;
if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &trans, NULL);
else
- ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &trans, rx_buf);
- m->actual_length = ret ? 0 : espi_trans.len;
+ m->actual_length = ret ? 0 : trans.len;
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
>From 50844eb4dd9f76cf213ea3baa1ab742f09232c58 Mon Sep 17 00:00:00 2001
From: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Fri, 19 Aug 2016 20:59:01 +0200
Subject: [PATCH 12/23] remove struct fsl_espi_transfer
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 56 +++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 36 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 4ff27bf..4c36a5d 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -37,12 +37,6 @@ struct fsl_espi_reg {
__be32 csmode[4]; /* 0x020 - 0x02c eSPI cs mode register */
};
-struct fsl_espi_transfer {
- const void *tx_buf;
- void *rx_buf;
- unsigned len;
-};
-
/* eSPI Controller mode register definitions */
#define SPMODE_ENABLE (1 << 31)
#define SPMODE_LOOP (1 << 30)
@@ -268,17 +262,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static int fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
- struct fsl_espi_transfer *espi_trans = tr;
- struct spi_transfer *t, *first, trans;
+ struct spi_transfer *t, *first;
int ret = 0;
- memset(&trans, 0, sizeof(trans));
-
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -289,26 +279,22 @@ static int fsl_espi_do_trans(struct spi_message *m,
return -EINVAL;
}
- trans.speed_hz = t->speed_hz;
- trans.bits_per_word = t->bits_per_word;
- trans.delay_usecs = max(first->delay_usecs, t->delay_usecs);
+ trans->speed_hz = t->speed_hz;
+ trans->bits_per_word = t->bits_per_word;
+ trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- trans.len = espi_trans->len;
- trans.tx_buf = espi_trans->tx_buf;
- trans.rx_buf = espi_trans->rx_buf;
-
- if (trans.bits_per_word || trans.speed_hz)
- fsl_espi_setup_transfer(spi, &trans);
+ if (trans->bits_per_word || trans->speed_hz)
+ fsl_espi_setup_transfer(spi, trans);
- if (trans.len)
- ret = fsl_espi_bufs(spi, &trans);
+ if (trans->len)
+ ret = fsl_espi_bufs(spi, trans);
if (ret)
ret = -EMSGSIZE;
- if (trans.delay_usecs)
- udelay(trans.delay_usecs);
+ if (trans->delay_usecs)
+ udelay(trans->delay_usecs);
fsl_espi_setup_transfer(spi, NULL);
@@ -316,22 +302,21 @@ static int fsl_espi_do_trans(struct spi_message *m,
}
static int fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct fsl_espi_transfer *espi_trans = trans;
int ret;
fsl_espi_copy_to_buf(m, mspi);
- espi_trans->tx_buf = espi_trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, espi_trans);
+ trans->tx_buf = trans->rx_buf = mspi->local_buf;
+ ret = fsl_espi_do_trans(m, trans);
return ret;
}
static int fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -355,10 +340,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
- struct fsl_espi_transfer espi_trans;
+ struct spi_transfer *t, trans = {};
int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -368,14 +352,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
xfer_len += t->len;
}
- espi_trans.len = xfer_len;
+ trans.len = xfer_len;
if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &trans, NULL);
else
- ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &trans, rx_buf);
- m->actual_length = ret ? 0 : espi_trans.len;
+ m->actual_length = ret ? 0 : trans.len;
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 13/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (10 preceding siblings ...)
2016-08-25 4:48 ` [PATCH 12/23] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
@ 2016-08-25 4:48 ` Heiner Kallweit
2016-08-25 4:48 ` [PATCH 14/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
` (57 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:48 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_cmd_trans and fsl_espi_rw_trans share most of the code so
we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 32 ++++++--------------------------
1 file changed, 6 insertions(+), 26 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 4c36a5d..6d06e14 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -301,22 +301,8 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_cmd_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- trans->tx_buf = trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, trans);
-
- return ret;
-}
-
-static int fsl_espi_rw_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
+ u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -327,12 +313,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
trans->tx_buf = trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
- if (!ret) {
- /* If there is at least one RX byte then copy it to rx_buff */
- if (trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only,
- trans->len - tx_only);
- }
+ /* If there is at least one RX byte then copy it to rx_buff */
+ if (!ret && rx_buff && trans->len > tx_only)
+ memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
return ret;
}
@@ -354,10 +337,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.len = xfer_len;
- if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &trans, NULL);
- else
- ret = fsl_espi_rw_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 14/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (11 preceding siblings ...)
2016-08-25 4:48 ` [PATCH 13/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
@ 2016-08-25 4:48 ` Heiner Kallweit
2016-08-25 4:49 ` [PATCH 15/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
` (56 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:48 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
SPI core takes care that both values are always populated.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 6d06e14..4c64012 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -284,8 +284,7 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- if (trans->bits_per_word || trans->speed_hz)
- fsl_espi_setup_transfer(spi, trans);
+ fsl_espi_setup_transfer(spi, trans);
if (trans->len)
ret = fsl_espi_bufs(spi, trans);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 15/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (12 preceding siblings ...)
2016-08-25 4:48 ` [PATCH 14/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
@ 2016-08-25 4:49 ` Heiner Kallweit
[not found] ` <d8aa466c-1366-8aa0-5cf6-d0be7dbafa3a-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:49 ` [PATCH 16/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
` (55 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:49 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Return a proper status code from fsl_espi_bufs instead of returning
the number of remaining words and let the caller evaluate it.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 4c64012..821ec3e 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -259,7 +259,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
/* disable rx ints */
mpc8xxx_spi_write_reg(®_base->mask, 0);
- return mpc8xxx_spi->count;
+ return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
@@ -289,9 +289,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
if (trans->len)
ret = fsl_espi_bufs(spi, trans);
- if (ret)
- ret = -EMSGSIZE;
-
if (trans->delay_usecs)
udelay(trans->delay_usecs);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 16/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (13 preceding siblings ...)
2016-08-25 4:49 ` [PATCH 15/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
@ 2016-08-25 4:49 ` Heiner Kallweit
[not found] ` <178b274d-2785-5f64-0334-40526c13d7f9-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:50 ` [PATCH 17/23] spi: fsl-espi: improve the ISR frame Heiner Kallweit
` (54 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:49 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_bufs and fsl_espi_cpu_bufs are very small that we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 27 ++++++++-------------------
1 file changed, 8 insertions(+), 19 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 821ec3e..ee4e778 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -207,31 +207,15 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
fsl_espi_change_mode(spi);
}
-static void fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
- unsigned int len)
-{
- u32 word;
- struct fsl_espi_reg *reg_base = mspi->reg_base;
-
- mspi->count = len;
-
- /* enable rx ints */
- mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
-
- /* transmit word */
- word = mspi->get_tx(mspi);
- mpc8xxx_spi_write_reg(®_base->transmit, word);
-}
-
static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
{
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
struct fsl_espi_reg *reg_base = mpc8xxx_spi->reg_base;
- unsigned int len = t->len;
+ u32 word;
int ret;
mpc8xxx_spi->len = t->len;
- len = roundup(len, 4) / 4;
+ mpc8xxx_spi->count = roundup(t->len, 4) / 4;
mpc8xxx_spi->tx = t->tx_buf;
mpc8xxx_spi->rx = t->rx_buf;
@@ -247,7 +231,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
- fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
+ /* enable rx ints */
+ mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
+
+ /* transmit word */
+ word = mpc8xxx_spi->get_tx(mpc8xxx_spi);
+ mpc8xxx_spi_write_reg(®_base->transmit, word);
/* Won't hang up forever, SPI bus sometimes got lost interrupts... */
ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 17/23] spi: fsl-espi: improve the ISR frame
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (14 preceding siblings ...)
2016-08-25 4:49 ` [PATCH 16/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
@ 2016-08-25 4:50 ` Heiner Kallweit
2016-08-25 4:50 ` [PATCH 18/23] spi: fsl-espi: factor out initial message checking Heiner Kallweit
` (53 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:50 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Improve the ISR frame:
- move resetting the event bits to the ISR frame
- change type of parameter irq to int
- make sure that the event bits match at least one bit in the
interrupt mask register
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index ee4e778..8d5bebc 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -451,17 +451,11 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
®_base->event)) & SPIE_NF), 1000, 0);
if (!ret) {
dev_err(mspi->dev, "tired waiting for SPIE_NF\n");
-
- /* Clear the SPIE bits */
- mpc8xxx_spi_write_reg(®_base->event, events);
complete(&mspi->done);
return;
}
}
- /* Clear the events */
- mpc8xxx_spi_write_reg(®_base->event, events);
-
mspi->count -= 1;
if (mspi->count) {
u32 word = mspi->get_tx(mspi);
@@ -472,23 +466,26 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
}
}
-static irqreturn_t fsl_espi_irq(s32 irq, void *context_data)
+static irqreturn_t fsl_espi_irq(int irq, void *context_data)
{
struct mpc8xxx_spi *mspi = context_data;
struct fsl_espi_reg *reg_base = mspi->reg_base;
- irqreturn_t ret = IRQ_NONE;
- u32 events;
+ u32 mask, events;
- /* Get interrupt events(tx/rx) */
+ /* Get interrupt mask and events and check that irq belongs to us */
+ mask = mpc8xxx_spi_read_reg(®_base->mask);
events = mpc8xxx_spi_read_reg(®_base->event);
- if (events)
- ret = IRQ_HANDLED;
+ if (!(mask & events))
+ return IRQ_NONE;
dev_vdbg(mspi->dev, "%s: events %x\n", __func__, events);
fsl_espi_cpu_irq(mspi, events);
- return ret;
+ /* Clear the events */
+ mpc8xxx_spi_write_reg(®_base->event, events);
+
+ return IRQ_HANDLED;
}
#ifdef CONFIG_PM
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 18/23] spi: fsl-espi: factor out initial message checking
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (15 preceding siblings ...)
2016-08-25 4:50 ` [PATCH 17/23] spi: fsl-espi: improve the ISR frame Heiner Kallweit
@ 2016-08-25 4:50 ` Heiner Kallweit
[not found] ` <bbdff897-50b8-c4b5-5598-1c82c6e530af-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:51 ` [PATCH 19/23] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
` (52 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:50 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Checking the message is currently done at diffrent places in the
driver. Factor it out to fsl_espi_check_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8d5bebc..d398caf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -97,6 +97,30 @@ static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
return tx_only;
}
+static int fsl_espi_check_message(struct spi_message *m)
+{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
+ struct spi_transfer *t, *first;
+
+ if (m->frame_length > SPCOM_TRANLEN_MAX) {
+ dev_err(mspi->dev, "message too long, size is %u bytes\n",
+ m->frame_length);
+ return -EMSGSIZE;
+ }
+
+ first = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (first->bits_per_word != t->bits_per_word ||
+ first->speed_hz != t->speed_hz) {
+ dev_err(mspi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -223,11 +247,6 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
reinit_completion(&mpc8xxx_spi->done);
/* Set SPCOM[CS] and SPCOM[TRANLEN] field */
- if (t->len > SPCOM_TRANLEN_MAX) {
- dev_err(mpc8xxx_spi->dev, "Transaction length (%d)"
- " beyond the SPCOM[TRANLEN] field\n", t->len);
- return -EINVAL;
- }
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
@@ -254,20 +273,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct spi_transfer *t, *first;
int ret = 0;
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((first->bits_per_word != t->bits_per_word) ||
- (first->speed_hz != t->speed_hz)) {
- dev_err(mspi->dev,
- "bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return -EINVAL;
- }
-
trans->speed_hz = t->speed_hz;
trans->bits_per_word = t->bits_per_word;
trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
@@ -313,6 +324,10 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_transfer *t, trans = {};
int ret;
+ ret = fsl_espi_check_message(m);
+ if (ret)
+ goto out;
+
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
@@ -325,7 +340,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
-
+out:
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 19/23] spi: fsl-espi: centralize populating struct spi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (16 preceding siblings ...)
2016-08-25 4:50 ` [PATCH 18/23] spi: fsl-espi: factor out initial message checking Heiner Kallweit
@ 2016-08-25 4:51 ` Heiner Kallweit
2016-08-25 4:51 ` [PATCH 20/23] spi: fsl-espi: factor out handling of read data Heiner Kallweit
` (51 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by population all elements of struct
spi_transfer in one place.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index d398caf..56f3a3d 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -273,17 +273,8 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct spi_transfer *t, *first;
int ret = 0;
- first = list_first_entry(&m->transfers, struct spi_transfer,
- transfer_list);
- list_for_each_entry(t, &m->transfers, transfer_list) {
- trans->speed_hz = t->speed_hz;
- trans->bits_per_word = t->bits_per_word;
- trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
- }
-
fsl_espi_setup_transfer(spi, trans);
if (trans->len)
@@ -306,7 +297,6 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
tx_only = fsl_espi_copy_to_buf(m, mspi);
- trans->tx_buf = trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
/* If there is at least one RX byte then copy it to rx_buff */
@@ -319,8 +309,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
u8 *rx_buf = NULL;
- unsigned int xfer_len = 0;
+ unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -333,9 +324,18 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
+ if (t->delay_usecs > delay_usecs)
+ delay_usecs = t->delay_usecs;
}
+ t = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+
trans.len = xfer_len;
+ trans.speed_hz = t->speed_hz;
+ trans.bits_per_word = t->bits_per_word;
+ trans.delay_usecs = delay_usecs;
+ trans.tx_buf = trans.rx_buf = mspi->local_buf;
ret = fsl_espi_trans(m, &trans, rx_buf);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 20/23] spi: fsl-espi: factor out handling of read data
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (17 preceding siblings ...)
2016-08-25 4:51 ` [PATCH 19/23] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
@ 2016-08-25 4:51 ` Heiner Kallweit
2016-08-25 4:51 ` [PATCH 21/23] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
` (50 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Factor out copying read data to the read buffers in the original
message to a new function fsl_espi_copy_from_buf.
This also allows to simplify fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 40 +++++++++++++++++++++-------------------
1 file changed, 21 insertions(+), 19 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 56f3a3d..d348a66 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -77,24 +77,32 @@ struct fsl_espi_reg {
#define AUTOSUSPEND_TIMEOUT 2000
-static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
- struct mpc8xxx_spi *mspi)
+static void fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
{
- unsigned int tx_only = 0;
struct spi_transfer *t;
u8 *buf = mspi->local_buf;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
+ if (t->tx_buf)
memcpy(buf, t->tx_buf, t->len);
- if (!t->rx_buf)
- tx_only += t->len;
- } else
+ else
memset(buf, 0, t->len);
buf += t->len;
}
+}
+
+static void fsl_espi_copy_from_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
- return tx_only;
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->rx_buf)
+ memcpy(t->rx_buf, buf, t->len);
+ buf += t->len;
+ }
}
static int fsl_espi_check_message(struct spi_message *m)
@@ -288,20 +296,17 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
- u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int tx_only;
int ret;
- tx_only = fsl_espi_copy_to_buf(m, mspi);
+ fsl_espi_copy_to_buf(m, mspi);
ret = fsl_espi_do_trans(m, trans);
- /* If there is at least one RX byte then copy it to rx_buff */
- if (!ret && rx_buff && trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
+ if (!ret)
+ fsl_espi_copy_from_buf(m, mspi);
return ret;
}
@@ -310,7 +315,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- u8 *rx_buf = NULL;
unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -320,8 +324,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->rx_buf)
- rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
@@ -337,7 +339,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.delay_usecs = delay_usecs;
trans.tx_buf = trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 21/23] spi: fsl-espi: simplify fsl_espi_setup_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (18 preceding siblings ...)
2016-08-25 4:51 ` [PATCH 20/23] spi: fsl-espi: factor out handling of read data Heiner Kallweit
@ 2016-08-25 4:51 ` Heiner Kallweit
[not found] ` <b65bdf36-d8cd-dc67-54ad-64672e367d2f-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-08-25 4:52 ` [PATCH 22/23] spi: fsl-espi: improve message length handling Heiner Kallweit
` (49 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Simplify fsl_espi_setup_transfer a little.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index d348a66..a5a67ce 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -210,12 +210,10 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
mpc8xxx_spi->get_rx = cs->get_rx;
mpc8xxx_spi->get_tx = cs->get_tx;
- bits_per_word = bits_per_word - 1;
-
/* mask out bits we are going to set */
cs->hw_mode &= ~(CSMODE_LEN(0xF) | CSMODE_DIV16 | CSMODE_PM(0xF));
- cs->hw_mode |= CSMODE_LEN(bits_per_word);
+ cs->hw_mode |= CSMODE_LEN(bits_per_word - 1);
if ((mpc8xxx_spi->spibrg / hz) > 64) {
cs->hw_mode |= CSMODE_DIV16;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 22/23] spi: fsl-espi: improve message length handling
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (19 preceding siblings ...)
2016-08-25 4:51 ` [PATCH 21/23] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
@ 2016-08-25 4:52 ` Heiner Kallweit
2016-08-25 4:52 ` [PATCH 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
` (48 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:52 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Move checking for a zero-length message up in the call chain and
use m->frame_length instead of re-calculating the overall length
of all transfers in the message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a5a67ce..51b0213 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -283,8 +283,7 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, trans);
- if (trans->len)
- ret = fsl_espi_bufs(spi, trans);
+ ret = fsl_espi_bufs(spi, trans);
if (trans->delay_usecs)
udelay(trans->delay_usecs);
@@ -313,7 +312,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int delay_usecs = 0, xfer_len = 0;
+ unsigned int delay_usecs = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -322,8 +321,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((t->tx_buf) || (t->rx_buf))
- xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
delay_usecs = t->delay_usecs;
}
@@ -331,13 +328,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
t = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
- trans.len = xfer_len;
+ trans.len = m->frame_length;
trans.speed_hz = t->speed_hz;
trans.bits_per_word = t->bits_per_word;
trans.delay_usecs = delay_usecs;
trans.tx_buf = trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans);
+ if (trans.len)
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (20 preceding siblings ...)
2016-08-25 4:52 ` [PATCH 22/23] spi: fsl-espi: improve message length handling Heiner Kallweit
@ 2016-08-25 4:52 ` Heiner Kallweit
[not found] ` <b8a3ee2d-b46a-2681-a11e-b5a773179589-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 20:02 ` [PATCH v2 02/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
` (47 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-08-25 4:52 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Merge both functions to reduce source code size and improve
readability.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
drivers/spi/spi-fsl-espi.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 51b0213..caedabd 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -276,11 +276,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
-static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct spi_device *spi = m->spi;
- int ret = 0;
+ int ret;
+ fsl_espi_copy_to_buf(m, mspi);
fsl_espi_setup_transfer(spi, trans);
ret = fsl_espi_bufs(spi, trans);
@@ -290,18 +292,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, NULL);
- return ret;
-}
-
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- ret = fsl_espi_do_trans(m, trans);
-
if (!ret)
fsl_espi_copy_from_buf(m, mspi);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 02/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (21 preceding siblings ...)
2016-08-25 4:52 ` [PATCH 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
@ 2016-09-02 20:02 ` Heiner Kallweit
[not found] ` <52c5893a-5927-4c83-4838-d618d434922c-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 20:03 ` [PATCH v2 08/23] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
` (46 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 20:02 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Both elements are not used, so remove them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- switch order of patches 2 and 3 to do the trivial changes first
---
drivers/spi/spi-fsl-espi.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index f9ef504..a9004fe 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,8 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned n_tx;
- unsigned n_rx;
unsigned actual_length;
int status;
};
@@ -371,24 +369,16 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
{
struct spi_transfer *t;
u8 *rx_buf = NULL;
- unsigned int n_tx = 0;
- unsigned int n_rx = 0;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf)
- n_tx += t->len;
- if (t->rx_buf) {
- n_rx += t->len;
+ if (t->rx_buf)
rx_buf = t->rx_buf;
- }
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
}
- espi_trans.n_tx = n_tx;
- espi_trans.n_rx = n_rx;
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
espi_trans.status = 0;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 08/23] spi: fsl-espi: factor out filling the local buffer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (22 preceding siblings ...)
2016-09-02 20:02 ` [PATCH v2 02/23] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-02 20:03 ` Heiner Kallweit
[not found] ` <75a01618-11f4-d54c-4cb7-21e1ed40951a-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 20:24 ` [PATCH v2 09/23] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
` (45 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 20:03 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by factoring out filling the local buffer.
In addition don't initialize the complete local buffer at the
beginning of fsl_espi_do_one_msg. Instead move initialization of
those parts of the local buffer to be used for transfers w/o tx_buf
to fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- fixed coding style issue
- improved commit message
---
drivers/spi/spi-fsl-espi.c | 46 ++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a3a75ae..c0023c0 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -85,6 +85,27 @@ struct fsl_espi_transfer {
#define AUTOSUSPEND_TIMEOUT 2000
+static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ unsigned int tx_only = 0;
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
+
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->tx_buf) {
+ memcpy(buf, t->tx_buf, t->len);
+ if (!t->rx_buf)
+ tx_only += t->len;
+ } else {
+ memset(buf, 0, t->len);
+ }
+ buf += t->len;
+ }
+
+ return tx_only;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -301,16 +322,9 @@ static void fsl_espi_cmd_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- int i = 0;
struct fsl_espi_transfer *espi_trans = trans;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- }
- }
+ fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
@@ -323,18 +337,9 @@ static void fsl_espi_rw_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- unsigned int tx_only = 0;
- int i = 0;
+ unsigned int tx_only;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- if (!t->rx_buf)
- tx_only += t->len;
- }
- }
+ tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
@@ -352,14 +357,11 @@ static void fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(master);
struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
- memset(mspi->local_buf, 0, SPCOM_TRANLEN_MAX);
-
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 09/23] spi: fsl-espi: simplify fsl_espi_setup_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (23 preceding siblings ...)
2016-09-02 20:03 ` [PATCH v2 08/23] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
@ 2016-09-02 20:24 ` Heiner Kallweit
2016-09-02 20:24 ` [PATCH v2 10/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
` (44 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 20:24 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Simplify fsl_espi_setup_transfer a little.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- changed order of patches to do trivial changes first
(was patch 21 of the series before)
---
drivers/spi/spi-fsl-espi.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index c0023c0..51696a6 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -187,12 +187,10 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
mpc8xxx_spi->get_rx = cs->get_rx;
mpc8xxx_spi->get_tx = cs->get_tx;
- bits_per_word = bits_per_word - 1;
-
/* mask out bits we are going to set */
cs->hw_mode &= ~(CSMODE_LEN(0xF) | CSMODE_DIV16 | CSMODE_PM(0xF));
- cs->hw_mode |= CSMODE_LEN(bits_per_word);
+ cs->hw_mode |= CSMODE_LEN(bits_per_word - 1);
if ((mpc8xxx_spi->spibrg / hz) > 64) {
cs->hw_mode |= CSMODE_DIV16;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 10/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (24 preceding siblings ...)
2016-09-02 20:24 ` [PATCH v2 09/23] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
@ 2016-09-02 20:24 ` Heiner Kallweit
[not found] ` <a246d482-9c6c-72ce-5179-f661de42cb5b-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:09 ` [PATCH v2 11/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
` (43 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 20:24 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
SPI core takes care that both values are always populated.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- switch order of patches to do trivial changes first
(was patch 14 of the series before)
---
drivers/spi/spi-fsl-espi.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 51696a6..8e6ef9b 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -300,8 +300,7 @@ static void fsl_espi_do_trans(struct spi_message *m,
trans.tx_buf = espi_trans->tx_buf;
trans.rx_buf = espi_trans->rx_buf;
- if (trans.bits_per_word || trans.speed_hz)
- fsl_espi_setup_transfer(spi, &trans);
+ fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
status = fsl_espi_bufs(spi, &trans);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 11/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (25 preceding siblings ...)
2016-09-02 20:24 ` [PATCH v2 10/23] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
@ 2016-09-02 21:09 ` Heiner Kallweit
[not found] ` <c4fba201-a69d-faa5-c5c5-6c9f51caedb2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 12/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
` (42 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:09 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Use the return values of the functions in the call chain to transport
status information instead of using an element in struct
fsl_espi_transfer for this.
This is more in line with the general approach how to handle status
information and is one step further to eventually get rid of
struct fsl_espi_transfer completely.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 47 +++++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8e6ef9b..5f01b65 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -42,7 +42,6 @@ struct fsl_espi_transfer {
void *rx_buf;
unsigned len;
unsigned actual_length;
- int status;
};
/* eSPI Controller mode register definitions */
@@ -269,14 +268,14 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static void fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m,
+ struct fsl_espi_transfer *tr)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct fsl_espi_transfer *espi_trans = tr;
struct spi_transfer *t, *first, trans;
- int status = 0;
+ int ret = 0;
memset(&trans, 0, sizeof(trans));
@@ -285,10 +284,9 @@ static void fsl_espi_do_trans(struct spi_message *m,
list_for_each_entry(t, &m->transfers, transfer_list) {
if ((first->bits_per_word != t->bits_per_word) ||
(first->speed_hz != t->speed_hz)) {
- espi_trans->status = -EINVAL;
dev_err(mspi->dev,
"bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return;
+ return -EINVAL;
}
trans.speed_hz = t->speed_hz;
@@ -303,52 +301,59 @@ static void fsl_espi_do_trans(struct spi_message *m,
fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
- status = fsl_espi_bufs(spi, &trans);
+ ret = fsl_espi_bufs(spi, &trans);
- if (status)
- status = -EMSGSIZE;
+ if (ret)
+ ret = -EMSGSIZE;
if (trans.delay_usecs)
udelay(trans.delay_usecs);
- espi_trans->status = status;
fsl_espi_setup_transfer(spi, NULL);
+
+ return ret;
}
-static void fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_cmd_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct fsl_espi_transfer *espi_trans = trans;
+ int ret;
fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, espi_trans);
+ ret = fsl_espi_do_trans(m, espi_trans);
espi_trans->actual_length = espi_trans->len;
+
+ return ret;
}
-static void fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_rw_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
+ int ret;
tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, trans);
+ ret = fsl_espi_do_trans(m, trans);
- if (!trans->status) {
+ if (!ret) {
/* If there is at least one RX byte then copy it to rx_buff */
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
trans->actual_length += trans->len;
}
+
+ return ret;
}
static int fsl_espi_do_one_msg(struct spi_master *master,
@@ -358,6 +363,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
+ int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
@@ -368,15 +374,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
- espi_trans.status = 0;
if (!rx_buf)
- fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
- fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = espi_trans.status;
+ m->status = ret;
spi_finalize_current_message(master);
return 0;
}
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 12/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (26 preceding siblings ...)
2016-09-02 21:09 ` [PATCH v2 11/23] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-02 21:22 ` [PATCH v2 13/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
` (41 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurred during message handling return this error instead
of always returning 0 and align the code with the generic
implementation in spi_transfer_one_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 5f01b65..6b60f7b 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -381,9 +381,12 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = ret;
+ if (m->status == -EINPROGRESS)
+ m->status = ret;
+
spi_finalize_current_message(master);
- return 0;
+
+ return ret;
}
static int fsl_espi_setup(struct spi_device *spi)
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 13/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (27 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 12/23] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <ebb38b20-1977-9980-9042-cefaac7ed765-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 14/23] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
` (40 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurs during processing the message, then we don't have
to populate the actual_length element of struct message.
So we can get rid of element actual_length in struct
fsl_espi_transfer.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 6b60f7b..726d5fd 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,7 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned actual_length;
};
/* eSPI Controller mode register definitions */
@@ -327,8 +326,6 @@ static int fsl_espi_cmd_trans(struct spi_message *m,
espi_trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, espi_trans);
- espi_trans->actual_length = espi_trans->len;
-
return ret;
}
@@ -350,7 +347,6 @@ static int fsl_espi_rw_trans(struct spi_message *m,
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
- trans->actual_length += trans->len;
}
return ret;
@@ -373,14 +369,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
}
espi_trans.len = xfer_len;
- espi_trans.actual_length = 0;
if (!rx_buf)
ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
- m->actual_length = espi_trans.actual_length;
+ m->actual_length = ret ? 0 : espi_trans.len;
+
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 14/23] spi: fsl-espi: eliminate struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (28 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 13/23] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <2872c612-a0c4-581f-4880-80bf7f8af9f9-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 15/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
` (39 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
The remaining elements of struct fsl_espi_transfer are part of struct
spi_transfer anyway. So we can get rid of struct fsl_espi_transfer
and use a struct spi_transfer only.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 56 +++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 36 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 726d5fd..8554f18 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -37,12 +37,6 @@ struct fsl_espi_reg {
__be32 csmode[4]; /* 0x020 - 0x02c eSPI cs mode register */
};
-struct fsl_espi_transfer {
- const void *tx_buf;
- void *rx_buf;
- unsigned len;
-};
-
/* eSPI Controller mode register definitions */
#define SPMODE_ENABLE (1 << 31)
#define SPMODE_LOOP (1 << 30)
@@ -267,17 +261,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static int fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
- struct fsl_espi_transfer *espi_trans = tr;
- struct spi_transfer *t, *first, trans;
+ struct spi_transfer *t, *first;
int ret = 0;
- memset(&trans, 0, sizeof(trans));
-
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -288,25 +278,21 @@ static int fsl_espi_do_trans(struct spi_message *m,
return -EINVAL;
}
- trans.speed_hz = t->speed_hz;
- trans.bits_per_word = t->bits_per_word;
- trans.delay_usecs = max(first->delay_usecs, t->delay_usecs);
+ trans->speed_hz = t->speed_hz;
+ trans->bits_per_word = t->bits_per_word;
+ trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- trans.len = espi_trans->len;
- trans.tx_buf = espi_trans->tx_buf;
- trans.rx_buf = espi_trans->rx_buf;
-
- fsl_espi_setup_transfer(spi, &trans);
+ fsl_espi_setup_transfer(spi, trans);
- if (trans.len)
- ret = fsl_espi_bufs(spi, &trans);
+ if (trans->len)
+ ret = fsl_espi_bufs(spi, trans);
if (ret)
ret = -EMSGSIZE;
- if (trans.delay_usecs)
- udelay(trans.delay_usecs);
+ if (trans->delay_usecs)
+ udelay(trans->delay_usecs);
fsl_espi_setup_transfer(spi, NULL);
@@ -314,23 +300,22 @@ static int fsl_espi_do_trans(struct spi_message *m,
}
static int fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct fsl_espi_transfer *espi_trans = trans;
int ret;
fsl_espi_copy_to_buf(m, mspi);
- espi_trans->tx_buf = mspi->local_buf;
- espi_trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, espi_trans);
+ trans->tx_buf = mspi->local_buf;
+ trans->rx_buf = mspi->local_buf;
+ ret = fsl_espi_do_trans(m, trans);
return ret;
}
static int fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -355,10 +340,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
- struct fsl_espi_transfer espi_trans;
+ struct spi_transfer *t, trans = {};
int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -368,14 +352,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
xfer_len += t->len;
}
- espi_trans.len = xfer_len;
+ trans.len = xfer_len;
if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &trans, NULL);
else
- ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &trans, rx_buf);
- m->actual_length = ret ? 0 : espi_trans.len;
+ m->actual_length = ret ? 0 : trans.len;
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 15/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (29 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 14/23] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <5cf9843f-11c0-4a14-d7ec-66522592ece9-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 16/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
` (38 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_cmd_trans and fsl_espi_rw_trans share most of the code so
we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8554f18..f8a6dd1 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -299,23 +299,8 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_cmd_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, trans);
-
- return ret;
-}
-
-static int fsl_espi_rw_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
+ u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -327,12 +312,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
- if (!ret) {
- /* If there is at least one RX byte then copy it to rx_buff */
- if (trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only,
- trans->len - tx_only);
- }
+ /* If there is at least one RX byte then copy it to rx_buff */
+ if (!ret && rx_buff && trans->len > tx_only)
+ memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
return ret;
}
@@ -354,10 +336,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.len = xfer_len;
- if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &trans, NULL);
- else
- ret = fsl_espi_rw_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 16/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (30 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 15/23] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-02 21:22 ` [PATCH v2 17/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
` (37 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Return a proper status code from fsl_espi_bufs instead of returning
the number of remaining words and let the caller evaluate it.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index f8a6dd1..8d6a570 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -258,7 +258,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
/* disable rx ints */
mpc8xxx_spi_write_reg(®_base->mask, 0);
- return mpc8xxx_spi->count;
+ return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
@@ -288,9 +288,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
if (trans->len)
ret = fsl_espi_bufs(spi, trans);
- if (ret)
- ret = -EMSGSIZE;
-
if (trans->delay_usecs)
udelay(trans->delay_usecs);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 17/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (31 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 16/23] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-02 21:22 ` [PATCH v2 18/23] spi: fsl-espi: improve the ISR frame Heiner Kallweit
` (36 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_bufs and fsl_espi_cpu_bufs are very small that we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 27 ++++++++-------------------
1 file changed, 8 insertions(+), 19 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8d6a570..190ca5c 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -206,31 +206,15 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
fsl_espi_change_mode(spi);
}
-static void fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
- unsigned int len)
-{
- u32 word;
- struct fsl_espi_reg *reg_base = mspi->reg_base;
-
- mspi->count = len;
-
- /* enable rx ints */
- mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
-
- /* transmit word */
- word = mspi->get_tx(mspi);
- mpc8xxx_spi_write_reg(®_base->transmit, word);
-}
-
static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
{
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
struct fsl_espi_reg *reg_base = mpc8xxx_spi->reg_base;
- unsigned int len = t->len;
+ u32 word;
int ret;
mpc8xxx_spi->len = t->len;
- len = roundup(len, 4) / 4;
+ mpc8xxx_spi->count = roundup(t->len, 4) / 4;
mpc8xxx_spi->tx = t->tx_buf;
mpc8xxx_spi->rx = t->rx_buf;
@@ -246,7 +230,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
- fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
+ /* enable rx ints */
+ mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
+
+ /* transmit word */
+ word = mpc8xxx_spi->get_tx(mpc8xxx_spi);
+ mpc8xxx_spi_write_reg(®_base->transmit, word);
/* Won't hang up forever, SPI bus sometimes got lost interrupts... */
ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 18/23] spi: fsl-espi: improve the ISR frame
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (32 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 17/23] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-02 21:22 ` [PATCH v2 19/23] spi: fsl-espi: factor out initial message checking Heiner Kallweit
` (35 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Improve the ISR frame:
- move resetting the event bits to the ISR frame
- change type of parameter irq to int
- make sure that the event bits match at least one bit in the
interrupt mask register
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 190ca5c..534dc14 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -451,17 +451,11 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
®_base->event)) & SPIE_NF), 1000, 0);
if (!ret) {
dev_err(mspi->dev, "tired waiting for SPIE_NF\n");
-
- /* Clear the SPIE bits */
- mpc8xxx_spi_write_reg(®_base->event, events);
complete(&mspi->done);
return;
}
}
- /* Clear the events */
- mpc8xxx_spi_write_reg(®_base->event, events);
-
mspi->count -= 1;
if (mspi->count) {
u32 word = mspi->get_tx(mspi);
@@ -472,23 +466,26 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
}
}
-static irqreturn_t fsl_espi_irq(s32 irq, void *context_data)
+static irqreturn_t fsl_espi_irq(int irq, void *context_data)
{
struct mpc8xxx_spi *mspi = context_data;
struct fsl_espi_reg *reg_base = mspi->reg_base;
- irqreturn_t ret = IRQ_NONE;
- u32 events;
+ u32 mask, events;
- /* Get interrupt events(tx/rx) */
+ /* Get interrupt mask and events and check that irq belongs to us */
+ mask = mpc8xxx_spi_read_reg(®_base->mask);
events = mpc8xxx_spi_read_reg(®_base->event);
- if (events)
- ret = IRQ_HANDLED;
+ if (!(mask & events))
+ return IRQ_NONE;
dev_vdbg(mspi->dev, "%s: events %x\n", __func__, events);
fsl_espi_cpu_irq(mspi, events);
- return ret;
+ /* Clear the events */
+ mpc8xxx_spi_write_reg(®_base->event, events);
+
+ return IRQ_HANDLED;
}
#ifdef CONFIG_PM
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 19/23] spi: fsl-espi: factor out initial message checking
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (33 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 18/23] spi: fsl-espi: improve the ISR frame Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-02 21:22 ` [PATCH v2 20/23] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
` (34 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Checking the message is currently done at diffrent places in the
driver. Factor it out to fsl_espi_check_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 534dc14..a32bc3a 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -98,6 +98,30 @@ static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
return tx_only;
}
+static int fsl_espi_check_message(struct spi_message *m)
+{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
+ struct spi_transfer *t, *first;
+
+ if (m->frame_length > SPCOM_TRANLEN_MAX) {
+ dev_err(mspi->dev, "message too long, size is %u bytes\n",
+ m->frame_length);
+ return -EMSGSIZE;
+ }
+
+ first = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (first->bits_per_word != t->bits_per_word ||
+ first->speed_hz != t->speed_hz) {
+ dev_err(mspi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -222,11 +246,6 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
reinit_completion(&mpc8xxx_spi->done);
/* Set SPCOM[CS] and SPCOM[TRANLEN] field */
- if (t->len > SPCOM_TRANLEN_MAX) {
- dev_err(mpc8xxx_spi->dev, "Transaction length (%d)"
- " beyond the SPCOM[TRANLEN] field\n", t->len);
- return -EINVAL;
- }
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
@@ -253,20 +272,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct spi_transfer *t, *first;
int ret = 0;
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((first->bits_per_word != t->bits_per_word) ||
- (first->speed_hz != t->speed_hz)) {
- dev_err(mspi->dev,
- "bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return -EINVAL;
- }
-
trans->speed_hz = t->speed_hz;
trans->bits_per_word = t->bits_per_word;
trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
@@ -313,6 +324,10 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_transfer *t, trans = {};
int ret;
+ ret = fsl_espi_check_message(m);
+ if (ret)
+ goto out;
+
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
@@ -325,7 +340,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
-
+out:
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 20/23] spi: fsl-espi: centralize populating struct spi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (34 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 19/23] spi: fsl-espi: factor out initial message checking Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <fc3ba27b-b7e1-a093-23d2-82956b8476c5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 21/23] spi: fsl-espi: factor out handling of read data Heiner Kallweit
` (33 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by population all elements of struct
spi_transfer in one place.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a32bc3a..79c89bf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -272,17 +272,8 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct spi_transfer *t, *first;
int ret = 0;
- first = list_first_entry(&m->transfers, struct spi_transfer,
- transfer_list);
- list_for_each_entry(t, &m->transfers, transfer_list) {
- trans->speed_hz = t->speed_hz;
- trans->bits_per_word = t->bits_per_word;
- trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
- }
-
fsl_espi_setup_transfer(spi, trans);
if (trans->len)
@@ -305,8 +296,6 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
tx_only = fsl_espi_copy_to_buf(m, mspi);
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
/* If there is at least one RX byte then copy it to rx_buff */
@@ -319,8 +308,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
u8 *rx_buf = NULL;
- unsigned int xfer_len = 0;
+ unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -333,9 +323,19 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
+ if (t->delay_usecs > delay_usecs)
+ delay_usecs = t->delay_usecs;
}
+ t = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+
trans.len = xfer_len;
+ trans.speed_hz = t->speed_hz;
+ trans.bits_per_word = t->bits_per_word;
+ trans.delay_usecs = delay_usecs;
+ trans.tx_buf = mspi->local_buf;
+ trans.rx_buf = mspi->local_buf;
ret = fsl_espi_trans(m, &trans, rx_buf);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 21/23] spi: fsl-espi: factor out handling of read data
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (35 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 20/23] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <23b15e58-4833-7180-5c5d-81af382c54c0-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 22/23] spi: fsl-espi: improve message length handling Heiner Kallweit
` (32 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Factor out copying read data to the read buffers in the original
message to a new function fsl_espi_copy_from_buf.
This also allows to simplify fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 41 +++++++++++++++++++++--------------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 79c89bf..88935a3 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -77,25 +77,32 @@ struct fsl_espi_reg {
#define AUTOSUSPEND_TIMEOUT 2000
-static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
- struct mpc8xxx_spi *mspi)
+static void fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
{
- unsigned int tx_only = 0;
struct spi_transfer *t;
u8 *buf = mspi->local_buf;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
+ if (t->tx_buf)
memcpy(buf, t->tx_buf, t->len);
- if (!t->rx_buf)
- tx_only += t->len;
- } else {
+ else
memset(buf, 0, t->len);
- }
buf += t->len;
}
+}
+
+static void fsl_espi_copy_from_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
- return tx_only;
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->rx_buf)
+ memcpy(t->rx_buf, buf, t->len);
+ buf += t->len;
+ }
}
static int fsl_espi_check_message(struct spi_message *m)
@@ -287,20 +294,17 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
- u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int tx_only;
int ret;
- tx_only = fsl_espi_copy_to_buf(m, mspi);
+ fsl_espi_copy_to_buf(m, mspi);
ret = fsl_espi_do_trans(m, trans);
- /* If there is at least one RX byte then copy it to rx_buff */
- if (!ret && rx_buff && trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
+ if (!ret)
+ fsl_espi_copy_from_buf(m, mspi);
return ret;
}
@@ -309,7 +313,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- u8 *rx_buf = NULL;
unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -319,8 +322,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->rx_buf)
- rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
@@ -337,7 +338,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 22/23] spi: fsl-espi: improve message length handling
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (36 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 21/23] spi: fsl-espi: factor out handling of read data Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
[not found] ` <aac7ea51-62ea-69b9-a149-2209e0766905-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-02 21:22 ` [PATCH v2 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
` (31 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Move checking for a zero-length message up in the call chain and
use m->frame_length instead of re-calculating the overall length
of all transfers in the message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 88935a3..84355bb 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -283,8 +283,7 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, trans);
- if (trans->len)
- ret = fsl_espi_bufs(spi, trans);
+ ret = fsl_espi_bufs(spi, trans);
if (trans->delay_usecs)
udelay(trans->delay_usecs);
@@ -313,7 +312,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int delay_usecs = 0, xfer_len = 0;
+ unsigned int delay_usecs = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -322,8 +321,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((t->tx_buf) || (t->rx_buf))
- xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
delay_usecs = t->delay_usecs;
}
@@ -331,14 +328,15 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
t = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
- trans.len = xfer_len;
+ trans.len = m->frame_length;
trans.speed_hz = t->speed_hz;
trans.bits_per_word = t->bits_per_word;
trans.delay_usecs = delay_usecs;
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans);
+ if (trans.len)
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (37 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 22/23] spi: fsl-espi: improve message length handling Heiner Kallweit
@ 2016-09-02 21:22 ` Heiner Kallweit
2016-09-04 7:53 ` [PATCH v2 01/18] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
` (30 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-02 21:22 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Merge both functions to reduce source code size and improve
readability.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 84355bb..f7d682f 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -276,11 +276,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
-static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct spi_device *spi = m->spi;
- int ret = 0;
+ int ret;
+ fsl_espi_copy_to_buf(m, mspi);
fsl_espi_setup_transfer(spi, trans);
ret = fsl_espi_bufs(spi, trans);
@@ -290,18 +292,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, NULL);
- return ret;
-}
-
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- ret = fsl_espi_do_trans(m, trans);
-
if (!ret)
fsl_espi_copy_from_buf(m, mspi);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 01/18] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (38 preceding siblings ...)
2016-09-02 21:22 ` [PATCH v2 23/23] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
@ 2016-09-04 7:53 ` Heiner Kallweit
2016-09-04 7:56 ` [PATCH v2 02/18] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
` (29 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:53 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Both elements are not used, so remove them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- switch order of patches to do the trivial changes first
---
drivers/spi/spi-fsl-espi.c | 12 +-----------
1 file changed, 1 insertion(+), 11 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index f9ef504..a9004fe 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,8 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned n_tx;
- unsigned n_rx;
unsigned actual_length;
int status;
};
@@ -371,24 +369,16 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
{
struct spi_transfer *t;
u8 *rx_buf = NULL;
- unsigned int n_tx = 0;
- unsigned int n_rx = 0;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf)
- n_tx += t->len;
- if (t->rx_buf) {
- n_rx += t->len;
+ if (t->rx_buf)
rx_buf = t->rx_buf;
- }
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
}
- espi_trans.n_tx = n_tx;
- espi_trans.n_rx = n_rx;
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
espi_trans.status = 0;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 02/18] spi: fsl-espi: simplify fsl_espi_setup_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (39 preceding siblings ...)
2016-09-04 7:53 ` [PATCH v2 01/18] spi: fsl-espi: remove unused elements n_rx and n_tx in struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-04 7:56 ` Heiner Kallweit
2016-09-04 7:57 ` [PATCH v2 03/18] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
` (28 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:56 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Simplify fsl_espi_setup_transfer a little.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- changed order of patches to do trivial changes first
---
drivers/spi/spi-fsl-espi.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index c0023c0..51696a6 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -187,12 +187,10 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
mpc8xxx_spi->get_rx = cs->get_rx;
mpc8xxx_spi->get_tx = cs->get_tx;
- bits_per_word = bits_per_word - 1;
-
/* mask out bits we are going to set */
cs->hw_mode &= ~(CSMODE_LEN(0xF) | CSMODE_DIV16 | CSMODE_PM(0xF));
- cs->hw_mode |= CSMODE_LEN(bits_per_word);
+ cs->hw_mode |= CSMODE_LEN(bits_per_word - 1);
if ((mpc8xxx_spi->spibrg / hz) > 64) {
cs->hw_mode |= CSMODE_DIV16;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 03/18] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (40 preceding siblings ...)
2016-09-04 7:56 ` [PATCH v2 02/18] spi: fsl-espi: simplify fsl_espi_setup_transfer Heiner Kallweit
@ 2016-09-04 7:57 ` Heiner Kallweit
2016-09-04 7:58 ` [PATCH v2 05/18] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
` (27 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:57 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
SPI core takes care that both values are always populated.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- switch order of patches to do trivial changes first
---
drivers/spi/spi-fsl-espi.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 51696a6..8e6ef9b 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -300,8 +300,7 @@ static void fsl_espi_do_trans(struct spi_message *m,
trans.tx_buf = espi_trans->tx_buf;
trans.rx_buf = espi_trans->rx_buf;
- if (trans.bits_per_word || trans.speed_hz)
- fsl_espi_setup_transfer(spi, &trans);
+ fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
status = fsl_espi_bufs(spi, &trans);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 05/18] spi: fsl-espi: factor out filling the local buffer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (41 preceding siblings ...)
2016-09-04 7:57 ` [PATCH v2 03/18] spi: fsl-espi: remove unneeded check in fsl_espi_do_trans Heiner Kallweit
@ 2016-09-04 7:58 ` Heiner Kallweit
2016-09-04 7:58 ` [PATCH v2 06/18] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
` (26 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:58 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by factoring out filling the local buffer.
In addition don't initialize the complete local buffer at the
beginning of fsl_espi_do_one_msg. Instead move initialization of
those parts of the local buffer to be used for transfers w/o tx_buf
to fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- fixed coding style issue
- improved commit message
---
drivers/spi/spi-fsl-espi.c | 46 ++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a3a75ae..c0023c0 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -85,6 +85,27 @@ struct fsl_espi_transfer {
#define AUTOSUSPEND_TIMEOUT 2000
+static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ unsigned int tx_only = 0;
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
+
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->tx_buf) {
+ memcpy(buf, t->tx_buf, t->len);
+ if (!t->rx_buf)
+ tx_only += t->len;
+ } else {
+ memset(buf, 0, t->len);
+ }
+ buf += t->len;
+ }
+
+ return tx_only;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -301,16 +322,9 @@ static void fsl_espi_cmd_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- int i = 0;
struct fsl_espi_transfer *espi_trans = trans;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- }
- }
+ fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
@@ -323,18 +337,9 @@ static void fsl_espi_rw_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- unsigned int tx_only = 0;
- int i = 0;
+ unsigned int tx_only;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- if (!t->rx_buf)
- tx_only += t->len;
- }
- }
+ tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
@@ -352,14 +357,11 @@ static void fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(master);
struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
- memset(mspi->local_buf, 0, SPCOM_TRANLEN_MAX);
-
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 06/18] spi: fsl-espi: remove element status from struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (42 preceding siblings ...)
2016-09-04 7:58 ` [PATCH v2 05/18] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
@ 2016-09-04 7:58 ` Heiner Kallweit
2016-09-04 7:59 ` [PATCH v2 07/18] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
` (25 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:58 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Use the return values of the functions in the call chain to transport
status information instead of using an element in struct
fsl_espi_transfer for this.
This is more in line with the general approach how to handle status
information and is one step further to eventually get rid of
struct fsl_espi_transfer completely.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 47 +++++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8e6ef9b..5f01b65 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -42,7 +42,6 @@ struct fsl_espi_transfer {
void *rx_buf;
unsigned len;
unsigned actual_length;
- int status;
};
/* eSPI Controller mode register definitions */
@@ -269,14 +268,14 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static void fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m,
+ struct fsl_espi_transfer *tr)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct fsl_espi_transfer *espi_trans = tr;
struct spi_transfer *t, *first, trans;
- int status = 0;
+ int ret = 0;
memset(&trans, 0, sizeof(trans));
@@ -285,10 +284,9 @@ static void fsl_espi_do_trans(struct spi_message *m,
list_for_each_entry(t, &m->transfers, transfer_list) {
if ((first->bits_per_word != t->bits_per_word) ||
(first->speed_hz != t->speed_hz)) {
- espi_trans->status = -EINVAL;
dev_err(mspi->dev,
"bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return;
+ return -EINVAL;
}
trans.speed_hz = t->speed_hz;
@@ -303,52 +301,59 @@ static void fsl_espi_do_trans(struct spi_message *m,
fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
- status = fsl_espi_bufs(spi, &trans);
+ ret = fsl_espi_bufs(spi, &trans);
- if (status)
- status = -EMSGSIZE;
+ if (ret)
+ ret = -EMSGSIZE;
if (trans.delay_usecs)
udelay(trans.delay_usecs);
- espi_trans->status = status;
fsl_espi_setup_transfer(spi, NULL);
+
+ return ret;
}
-static void fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_cmd_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct fsl_espi_transfer *espi_trans = trans;
+ int ret;
fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, espi_trans);
+ ret = fsl_espi_do_trans(m, espi_trans);
espi_trans->actual_length = espi_trans->len;
+
+ return ret;
}
-static void fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_rw_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
+ int ret;
tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, trans);
+ ret = fsl_espi_do_trans(m, trans);
- if (!trans->status) {
+ if (!ret) {
/* If there is at least one RX byte then copy it to rx_buff */
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
trans->actual_length += trans->len;
}
+
+ return ret;
}
static int fsl_espi_do_one_msg(struct spi_master *master,
@@ -358,6 +363,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
+ int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
@@ -368,15 +374,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
- espi_trans.status = 0;
if (!rx_buf)
- fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
- fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = espi_trans.status;
+ m->status = ret;
spi_finalize_current_message(master);
return 0;
}
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 07/18] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (43 preceding siblings ...)
2016-09-04 7:58 ` [PATCH v2 06/18] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-04 7:59 ` Heiner Kallweit
2016-09-04 7:59 ` [PATCH v2 08/18] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
` (24 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:59 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurred during message handling return this error instead
of always returning 0 and align the code with the generic
implementation in spi_transfer_one_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 5f01b65..6b60f7b 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -381,9 +381,12 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = ret;
+ if (m->status == -EINPROGRESS)
+ m->status = ret;
+
spi_finalize_current_message(master);
- return 0;
+
+ return ret;
}
static int fsl_espi_setup(struct spi_device *spi)
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 08/18] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (44 preceding siblings ...)
2016-09-04 7:59 ` [PATCH v2 07/18] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
@ 2016-09-04 7:59 ` Heiner Kallweit
2016-09-04 8:00 ` [PATCH v2 09/18] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
` (23 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 7:59 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurs during processing the message, then we don't have
to populate the actual_length element of struct message.
So we can get rid of element actual_length in struct
fsl_espi_transfer.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 6b60f7b..726d5fd 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,7 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned actual_length;
};
/* eSPI Controller mode register definitions */
@@ -327,8 +326,6 @@ static int fsl_espi_cmd_trans(struct spi_message *m,
espi_trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, espi_trans);
- espi_trans->actual_length = espi_trans->len;
-
return ret;
}
@@ -350,7 +347,6 @@ static int fsl_espi_rw_trans(struct spi_message *m,
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
- trans->actual_length += trans->len;
}
return ret;
@@ -373,14 +369,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
}
espi_trans.len = xfer_len;
- espi_trans.actual_length = 0;
if (!rx_buf)
ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
- m->actual_length = espi_trans.actual_length;
+ m->actual_length = ret ? 0 : espi_trans.len;
+
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 09/18] spi: fsl-espi: eliminate struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (45 preceding siblings ...)
2016-09-04 7:59 ` [PATCH v2 08/18] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
@ 2016-09-04 8:00 ` Heiner Kallweit
2016-09-04 8:00 ` [PATCH v2 10/18] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
` (22 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:00 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
The remaining elements of struct fsl_espi_transfer are part of struct
spi_transfer anyway. So we can get rid of struct fsl_espi_transfer
and use a struct spi_transfer only.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 56 +++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 36 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 726d5fd..8554f18 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -37,12 +37,6 @@ struct fsl_espi_reg {
__be32 csmode[4]; /* 0x020 - 0x02c eSPI cs mode register */
};
-struct fsl_espi_transfer {
- const void *tx_buf;
- void *rx_buf;
- unsigned len;
-};
-
/* eSPI Controller mode register definitions */
#define SPMODE_ENABLE (1 << 31)
#define SPMODE_LOOP (1 << 30)
@@ -267,17 +261,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static int fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
- struct fsl_espi_transfer *espi_trans = tr;
- struct spi_transfer *t, *first, trans;
+ struct spi_transfer *t, *first;
int ret = 0;
- memset(&trans, 0, sizeof(trans));
-
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -288,25 +278,21 @@ static int fsl_espi_do_trans(struct spi_message *m,
return -EINVAL;
}
- trans.speed_hz = t->speed_hz;
- trans.bits_per_word = t->bits_per_word;
- trans.delay_usecs = max(first->delay_usecs, t->delay_usecs);
+ trans->speed_hz = t->speed_hz;
+ trans->bits_per_word = t->bits_per_word;
+ trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- trans.len = espi_trans->len;
- trans.tx_buf = espi_trans->tx_buf;
- trans.rx_buf = espi_trans->rx_buf;
-
- fsl_espi_setup_transfer(spi, &trans);
+ fsl_espi_setup_transfer(spi, trans);
- if (trans.len)
- ret = fsl_espi_bufs(spi, &trans);
+ if (trans->len)
+ ret = fsl_espi_bufs(spi, trans);
if (ret)
ret = -EMSGSIZE;
- if (trans.delay_usecs)
- udelay(trans.delay_usecs);
+ if (trans->delay_usecs)
+ udelay(trans->delay_usecs);
fsl_espi_setup_transfer(spi, NULL);
@@ -314,23 +300,22 @@ static int fsl_espi_do_trans(struct spi_message *m,
}
static int fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct fsl_espi_transfer *espi_trans = trans;
int ret;
fsl_espi_copy_to_buf(m, mspi);
- espi_trans->tx_buf = mspi->local_buf;
- espi_trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, espi_trans);
+ trans->tx_buf = mspi->local_buf;
+ trans->rx_buf = mspi->local_buf;
+ ret = fsl_espi_do_trans(m, trans);
return ret;
}
static int fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -355,10 +340,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
- struct fsl_espi_transfer espi_trans;
+ struct spi_transfer *t, trans = {};
int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -368,14 +352,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
xfer_len += t->len;
}
- espi_trans.len = xfer_len;
+ trans.len = xfer_len;
if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &trans, NULL);
else
- ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &trans, rx_buf);
- m->actual_length = ret ? 0 : espi_trans.len;
+ m->actual_length = ret ? 0 : trans.len;
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 10/18] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (46 preceding siblings ...)
2016-09-04 8:00 ` [PATCH v2 09/18] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-04 8:00 ` Heiner Kallweit
2016-09-04 8:01 ` [PATCH v2 11/18] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
` (21 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:00 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_cmd_trans and fsl_espi_rw_trans share most of the code so
we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8554f18..f8a6dd1 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -299,23 +299,8 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_cmd_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, trans);
-
- return ret;
-}
-
-static int fsl_espi_rw_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
+ u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -327,12 +312,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
- if (!ret) {
- /* If there is at least one RX byte then copy it to rx_buff */
- if (trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only,
- trans->len - tx_only);
- }
+ /* If there is at least one RX byte then copy it to rx_buff */
+ if (!ret && rx_buff && trans->len > tx_only)
+ memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
return ret;
}
@@ -354,10 +336,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.len = xfer_len;
- if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &trans, NULL);
- else
- ret = fsl_espi_rw_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 11/18] spi: fsl-espi: improve return value handling in fsl_espi_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (47 preceding siblings ...)
2016-09-04 8:00 ` [PATCH v2 10/18] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
@ 2016-09-04 8:01 ` Heiner Kallweit
2016-09-04 8:01 ` [PATCH v2 12/18] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
` (20 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:01 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Return a proper status code from fsl_espi_bufs instead of returning
the number of remaining words and let the caller evaluate it.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index f8a6dd1..8d6a570 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -258,7 +258,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
/* disable rx ints */
mpc8xxx_spi_write_reg(®_base->mask, 0);
- return mpc8xxx_spi->count;
+ return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
@@ -288,9 +288,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
if (trans->len)
ret = fsl_espi_bufs(spi, trans);
- if (ret)
- ret = -EMSGSIZE;
-
if (trans->delay_usecs)
udelay(trans->delay_usecs);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 12/18] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (48 preceding siblings ...)
2016-09-04 8:01 ` [PATCH v2 11/18] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
@ 2016-09-04 8:01 ` Heiner Kallweit
2016-09-04 8:01 ` [PATCH v2 13/18] spi: fsl-espi: improve the ISR frame Heiner Kallweit
` (19 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:01 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_bufs and fsl_espi_cpu_bufs are very small that we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 27 ++++++++-------------------
1 file changed, 8 insertions(+), 19 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8d6a570..190ca5c 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -206,31 +206,15 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
fsl_espi_change_mode(spi);
}
-static void fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
- unsigned int len)
-{
- u32 word;
- struct fsl_espi_reg *reg_base = mspi->reg_base;
-
- mspi->count = len;
-
- /* enable rx ints */
- mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
-
- /* transmit word */
- word = mspi->get_tx(mspi);
- mpc8xxx_spi_write_reg(®_base->transmit, word);
-}
-
static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
{
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
struct fsl_espi_reg *reg_base = mpc8xxx_spi->reg_base;
- unsigned int len = t->len;
+ u32 word;
int ret;
mpc8xxx_spi->len = t->len;
- len = roundup(len, 4) / 4;
+ mpc8xxx_spi->count = roundup(t->len, 4) / 4;
mpc8xxx_spi->tx = t->tx_buf;
mpc8xxx_spi->rx = t->rx_buf;
@@ -246,7 +230,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
- fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
+ /* enable rx ints */
+ mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
+
+ /* transmit word */
+ word = mpc8xxx_spi->get_tx(mpc8xxx_spi);
+ mpc8xxx_spi_write_reg(®_base->transmit, word);
/* Won't hang up forever, SPI bus sometimes got lost interrupts... */
ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 13/18] spi: fsl-espi: improve the ISR frame
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (49 preceding siblings ...)
2016-09-04 8:01 ` [PATCH v2 12/18] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
@ 2016-09-04 8:01 ` Heiner Kallweit
2016-09-04 8:01 ` [PATCH v2 14/18] spi: fsl-espi: factor out initial message checking Heiner Kallweit
` (18 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:01 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Improve the ISR frame:
- move resetting the event bits to the ISR frame
- change type of parameter irq to int
- make sure that the event bits match at least one bit in the
interrupt mask register
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 190ca5c..534dc14 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -451,17 +451,11 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
®_base->event)) & SPIE_NF), 1000, 0);
if (!ret) {
dev_err(mspi->dev, "tired waiting for SPIE_NF\n");
-
- /* Clear the SPIE bits */
- mpc8xxx_spi_write_reg(®_base->event, events);
complete(&mspi->done);
return;
}
}
- /* Clear the events */
- mpc8xxx_spi_write_reg(®_base->event, events);
-
mspi->count -= 1;
if (mspi->count) {
u32 word = mspi->get_tx(mspi);
@@ -472,23 +466,26 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
}
}
-static irqreturn_t fsl_espi_irq(s32 irq, void *context_data)
+static irqreturn_t fsl_espi_irq(int irq, void *context_data)
{
struct mpc8xxx_spi *mspi = context_data;
struct fsl_espi_reg *reg_base = mspi->reg_base;
- irqreturn_t ret = IRQ_NONE;
- u32 events;
+ u32 mask, events;
- /* Get interrupt events(tx/rx) */
+ /* Get interrupt mask and events and check that irq belongs to us */
+ mask = mpc8xxx_spi_read_reg(®_base->mask);
events = mpc8xxx_spi_read_reg(®_base->event);
- if (events)
- ret = IRQ_HANDLED;
+ if (!(mask & events))
+ return IRQ_NONE;
dev_vdbg(mspi->dev, "%s: events %x\n", __func__, events);
fsl_espi_cpu_irq(mspi, events);
- return ret;
+ /* Clear the events */
+ mpc8xxx_spi_write_reg(®_base->event, events);
+
+ return IRQ_HANDLED;
}
#ifdef CONFIG_PM
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 14/18] spi: fsl-espi: factor out initial message checking
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (50 preceding siblings ...)
2016-09-04 8:01 ` [PATCH v2 13/18] spi: fsl-espi: improve the ISR frame Heiner Kallweit
@ 2016-09-04 8:01 ` Heiner Kallweit
2016-09-04 8:02 ` [PATCH v2 15/18] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
` (17 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:01 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Checking the message is currently done at diffrent places in the
driver. Factor it out to fsl_espi_check_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 534dc14..a32bc3a 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -98,6 +98,30 @@ static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
return tx_only;
}
+static int fsl_espi_check_message(struct spi_message *m)
+{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
+ struct spi_transfer *t, *first;
+
+ if (m->frame_length > SPCOM_TRANLEN_MAX) {
+ dev_err(mspi->dev, "message too long, size is %u bytes\n",
+ m->frame_length);
+ return -EMSGSIZE;
+ }
+
+ first = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (first->bits_per_word != t->bits_per_word ||
+ first->speed_hz != t->speed_hz) {
+ dev_err(mspi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -222,11 +246,6 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
reinit_completion(&mpc8xxx_spi->done);
/* Set SPCOM[CS] and SPCOM[TRANLEN] field */
- if (t->len > SPCOM_TRANLEN_MAX) {
- dev_err(mpc8xxx_spi->dev, "Transaction length (%d)"
- " beyond the SPCOM[TRANLEN] field\n", t->len);
- return -EINVAL;
- }
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
@@ -253,20 +272,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct spi_transfer *t, *first;
int ret = 0;
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((first->bits_per_word != t->bits_per_word) ||
- (first->speed_hz != t->speed_hz)) {
- dev_err(mspi->dev,
- "bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return -EINVAL;
- }
-
trans->speed_hz = t->speed_hz;
trans->bits_per_word = t->bits_per_word;
trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
@@ -313,6 +324,10 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_transfer *t, trans = {};
int ret;
+ ret = fsl_espi_check_message(m);
+ if (ret)
+ goto out;
+
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
@@ -325,7 +340,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
-
+out:
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 15/18] spi: fsl-espi: centralize populating struct spi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (51 preceding siblings ...)
2016-09-04 8:01 ` [PATCH v2 14/18] spi: fsl-espi: factor out initial message checking Heiner Kallweit
@ 2016-09-04 8:02 ` Heiner Kallweit
2016-09-04 8:02 ` [PATCH v2 16/18] spi: fsl-espi: factor out handling of read data Heiner Kallweit
` (16 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:02 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by population all elements of struct
spi_transfer in one place.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a32bc3a..79c89bf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -272,17 +272,8 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct spi_transfer *t, *first;
int ret = 0;
- first = list_first_entry(&m->transfers, struct spi_transfer,
- transfer_list);
- list_for_each_entry(t, &m->transfers, transfer_list) {
- trans->speed_hz = t->speed_hz;
- trans->bits_per_word = t->bits_per_word;
- trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
- }
-
fsl_espi_setup_transfer(spi, trans);
if (trans->len)
@@ -305,8 +296,6 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
tx_only = fsl_espi_copy_to_buf(m, mspi);
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
/* If there is at least one RX byte then copy it to rx_buff */
@@ -319,8 +308,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
u8 *rx_buf = NULL;
- unsigned int xfer_len = 0;
+ unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -333,9 +323,19 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
+ if (t->delay_usecs > delay_usecs)
+ delay_usecs = t->delay_usecs;
}
+ t = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+
trans.len = xfer_len;
+ trans.speed_hz = t->speed_hz;
+ trans.bits_per_word = t->bits_per_word;
+ trans.delay_usecs = delay_usecs;
+ trans.tx_buf = mspi->local_buf;
+ trans.rx_buf = mspi->local_buf;
ret = fsl_espi_trans(m, &trans, rx_buf);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 16/18] spi: fsl-espi: factor out handling of read data
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (52 preceding siblings ...)
2016-09-04 8:02 ` [PATCH v2 15/18] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
@ 2016-09-04 8:02 ` Heiner Kallweit
2016-09-04 8:02 ` [PATCH v2 17/18] spi: fsl-espi: improve message length handling Heiner Kallweit
` (15 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:02 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Factor out copying read data to the read buffers in the original
message to a new function fsl_espi_copy_from_buf.
This also allows to simplify fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 41 +++++++++++++++++++++--------------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 79c89bf..88935a3 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -77,25 +77,32 @@ struct fsl_espi_reg {
#define AUTOSUSPEND_TIMEOUT 2000
-static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
- struct mpc8xxx_spi *mspi)
+static void fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
{
- unsigned int tx_only = 0;
struct spi_transfer *t;
u8 *buf = mspi->local_buf;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
+ if (t->tx_buf)
memcpy(buf, t->tx_buf, t->len);
- if (!t->rx_buf)
- tx_only += t->len;
- } else {
+ else
memset(buf, 0, t->len);
- }
buf += t->len;
}
+}
+
+static void fsl_espi_copy_from_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
- return tx_only;
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->rx_buf)
+ memcpy(t->rx_buf, buf, t->len);
+ buf += t->len;
+ }
}
static int fsl_espi_check_message(struct spi_message *m)
@@ -287,20 +294,17 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
- u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int tx_only;
int ret;
- tx_only = fsl_espi_copy_to_buf(m, mspi);
+ fsl_espi_copy_to_buf(m, mspi);
ret = fsl_espi_do_trans(m, trans);
- /* If there is at least one RX byte then copy it to rx_buff */
- if (!ret && rx_buff && trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
+ if (!ret)
+ fsl_espi_copy_from_buf(m, mspi);
return ret;
}
@@ -309,7 +313,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- u8 *rx_buf = NULL;
unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -319,8 +322,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->rx_buf)
- rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
@@ -337,7 +338,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 17/18] spi: fsl-espi: improve message length handling
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (53 preceding siblings ...)
2016-09-04 8:02 ` [PATCH v2 16/18] spi: fsl-espi: factor out handling of read data Heiner Kallweit
@ 2016-09-04 8:02 ` Heiner Kallweit
2016-09-04 8:02 ` [PATCH v2 18/18] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
` (14 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:02 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Move checking for a zero-length message up in the call chain and
use m->frame_length instead of re-calculating the overall length
of all transfers in the message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 88935a3..84355bb 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -283,8 +283,7 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, trans);
- if (trans->len)
- ret = fsl_espi_bufs(spi, trans);
+ ret = fsl_espi_bufs(spi, trans);
if (trans->delay_usecs)
udelay(trans->delay_usecs);
@@ -313,7 +312,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int delay_usecs = 0, xfer_len = 0;
+ unsigned int delay_usecs = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -322,8 +321,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((t->tx_buf) || (t->rx_buf))
- xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
delay_usecs = t->delay_usecs;
}
@@ -331,14 +328,15 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
t = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
- trans.len = xfer_len;
+ trans.len = m->frame_length;
trans.speed_hz = t->speed_hz;
trans.bits_per_word = t->bits_per_word;
trans.delay_usecs = delay_usecs;
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans);
+ if (trans.len)
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v2 18/18] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (54 preceding siblings ...)
2016-09-04 8:02 ` [PATCH v2 17/18] spi: fsl-espi: improve message length handling Heiner Kallweit
@ 2016-09-04 8:02 ` Heiner Kallweit
2016-09-07 20:50 ` [PATCH v3 02/15] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
` (13 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-04 8:02 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Merge both functions to reduce source code size and improve
readability.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
---
drivers/spi/spi-fsl-espi.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 84355bb..f7d682f 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -276,11 +276,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
-static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct spi_device *spi = m->spi;
- int ret = 0;
+ int ret;
+ fsl_espi_copy_to_buf(m, mspi);
fsl_espi_setup_transfer(spi, trans);
ret = fsl_espi_bufs(spi, trans);
@@ -290,18 +292,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, NULL);
- return ret;
-}
-
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- ret = fsl_espi_do_trans(m, trans);
-
if (!ret)
fsl_espi_copy_from_buf(m, mspi);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 02/15] spi: fsl-espi: factor out filling the local buffer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (55 preceding siblings ...)
2016-09-04 8:02 ` [PATCH v2 18/18] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
@ 2016-09-07 20:50 ` Heiner Kallweit
2016-09-07 20:51 ` [PATCH v3 03/15] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
` (12 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:50 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by factoring out filling the local buffer.
In addition don't initialize the complete local buffer at the
beginning of fsl_espi_do_one_msg. Instead move initialization of
those parts of the local buffer to be used for transfers w/o tx_buf
to fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- fixed coding style issue
- improved commit message
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 46 ++++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 22 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a3a75ae..c0023c0 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -85,6 +85,27 @@ struct fsl_espi_transfer {
#define AUTOSUSPEND_TIMEOUT 2000
+static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ unsigned int tx_only = 0;
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
+
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->tx_buf) {
+ memcpy(buf, t->tx_buf, t->len);
+ if (!t->rx_buf)
+ tx_only += t->len;
+ } else {
+ memset(buf, 0, t->len);
+ }
+ buf += t->len;
+ }
+
+ return tx_only;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -301,16 +322,9 @@ static void fsl_espi_cmd_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- int i = 0;
struct fsl_espi_transfer *espi_trans = trans;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- }
- }
+ fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
@@ -323,18 +337,9 @@ static void fsl_espi_rw_trans(struct spi_message *m,
struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct spi_transfer *t;
- unsigned int tx_only = 0;
- int i = 0;
+ unsigned int tx_only;
- list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
- memcpy(mspi->local_buf + i, t->tx_buf, t->len);
- i += t->len;
- if (!t->rx_buf)
- tx_only += t->len;
- }
- }
+ tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
@@ -352,14 +357,11 @@ static void fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(master);
struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
- memset(mspi->local_buf, 0, SPCOM_TRANLEN_MAX);
-
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 03/15] spi: fsl-espi: remove element status from struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (56 preceding siblings ...)
2016-09-07 20:50 ` [PATCH v3 02/15] spi: fsl-espi: factor out filling the local buffer Heiner Kallweit
@ 2016-09-07 20:51 ` Heiner Kallweit
2016-09-07 20:51 ` [PATCH v3 04/15] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
` (11 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Use the return values of the functions in the call chain to transport
status information instead of using an element in struct
fsl_espi_transfer for this.
This is more in line with the general approach how to handle status
information and is one step further to eventually get rid of
struct fsl_espi_transfer completely.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 47 +++++++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8e6ef9b..5f01b65 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -42,7 +42,6 @@ struct fsl_espi_transfer {
void *rx_buf;
unsigned len;
unsigned actual_length;
- int status;
};
/* eSPI Controller mode register definitions */
@@ -269,14 +268,14 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static void fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m,
+ struct fsl_espi_transfer *tr)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct fsl_espi_transfer *espi_trans = tr;
struct spi_transfer *t, *first, trans;
- int status = 0;
+ int ret = 0;
memset(&trans, 0, sizeof(trans));
@@ -285,10 +284,9 @@ static void fsl_espi_do_trans(struct spi_message *m,
list_for_each_entry(t, &m->transfers, transfer_list) {
if ((first->bits_per_word != t->bits_per_word) ||
(first->speed_hz != t->speed_hz)) {
- espi_trans->status = -EINVAL;
dev_err(mspi->dev,
"bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return;
+ return -EINVAL;
}
trans.speed_hz = t->speed_hz;
@@ -303,52 +301,59 @@ static void fsl_espi_do_trans(struct spi_message *m,
fsl_espi_setup_transfer(spi, &trans);
if (trans.len)
- status = fsl_espi_bufs(spi, &trans);
+ ret = fsl_espi_bufs(spi, &trans);
- if (status)
- status = -EMSGSIZE;
+ if (ret)
+ ret = -EMSGSIZE;
if (trans.delay_usecs)
udelay(trans.delay_usecs);
- espi_trans->status = status;
fsl_espi_setup_transfer(spi, NULL);
+
+ return ret;
}
-static void fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_cmd_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct fsl_espi_transfer *espi_trans = trans;
+ int ret;
fsl_espi_copy_to_buf(m, mspi);
espi_trans->tx_buf = mspi->local_buf;
espi_trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, espi_trans);
+ ret = fsl_espi_do_trans(m, espi_trans);
espi_trans->actual_length = espi_trans->len;
+
+ return ret;
}
-static void fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_rw_trans(struct spi_message *m,
+ struct fsl_espi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
+ int ret;
tx_only = fsl_espi_copy_to_buf(m, mspi);
trans->tx_buf = mspi->local_buf;
trans->rx_buf = mspi->local_buf;
- fsl_espi_do_trans(m, trans);
+ ret = fsl_espi_do_trans(m, trans);
- if (!trans->status) {
+ if (!ret) {
/* If there is at least one RX byte then copy it to rx_buff */
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
trans->actual_length += trans->len;
}
+
+ return ret;
}
static int fsl_espi_do_one_msg(struct spi_master *master,
@@ -358,6 +363,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
struct fsl_espi_transfer espi_trans;
+ int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
@@ -368,15 +374,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
espi_trans.len = xfer_len;
espi_trans.actual_length = 0;
- espi_trans.status = 0;
if (!rx_buf)
- fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
- fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = espi_trans.status;
+ m->status = ret;
spi_finalize_current_message(master);
return 0;
}
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 04/15] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (57 preceding siblings ...)
2016-09-07 20:51 ` [PATCH v3 03/15] spi: fsl-espi: remove element status from struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-07 20:51 ` Heiner Kallweit
2016-09-07 20:51 ` [PATCH v3 05/15] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
` (10 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurred during message handling return this error instead
of always returning 0 and align the code with the generic
implementation in spi_transfer_one_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 5f01b65..6b60f7b 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -381,9 +381,12 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
m->actual_length = espi_trans.actual_length;
- m->status = ret;
+ if (m->status == -EINPROGRESS)
+ m->status = ret;
+
spi_finalize_current_message(master);
- return 0;
+
+ return ret;
}
static int fsl_espi_setup(struct spi_device *spi)
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 05/15] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (58 preceding siblings ...)
2016-09-07 20:51 ` [PATCH v3 04/15] spi: fsl-espi: fix status handling in fsl_espi_do_one_msg Heiner Kallweit
@ 2016-09-07 20:51 ` Heiner Kallweit
2016-09-07 20:52 ` [PATCH v3 06/15] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
` (9 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:51 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
If an error occurs during processing the message, then we don't have
to populate the actual_length element of struct message.
So we can get rid of element actual_length in struct
fsl_espi_transfer.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 6b60f7b..726d5fd 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -41,7 +41,6 @@ struct fsl_espi_transfer {
const void *tx_buf;
void *rx_buf;
unsigned len;
- unsigned actual_length;
};
/* eSPI Controller mode register definitions */
@@ -327,8 +326,6 @@ static int fsl_espi_cmd_trans(struct spi_message *m,
espi_trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, espi_trans);
- espi_trans->actual_length = espi_trans->len;
-
return ret;
}
@@ -350,7 +347,6 @@ static int fsl_espi_rw_trans(struct spi_message *m,
if (trans->len > tx_only)
memcpy(rx_buff, trans->rx_buf + tx_only,
trans->len - tx_only);
- trans->actual_length += trans->len;
}
return ret;
@@ -373,14 +369,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
}
espi_trans.len = xfer_len;
- espi_trans.actual_length = 0;
if (!rx_buf)
ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
else
ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
- m->actual_length = espi_trans.actual_length;
+ m->actual_length = ret ? 0 : espi_trans.len;
+
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 06/15] spi: fsl-espi: eliminate struct fsl_espi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (59 preceding siblings ...)
2016-09-07 20:51 ` [PATCH v3 05/15] spi: fsl-espi: remove element actual_length from struct fsl_espi_trans Heiner Kallweit
@ 2016-09-07 20:52 ` Heiner Kallweit
2016-09-07 20:52 ` [PATCH v3 07/15] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
` (8 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:52 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
The remaining elements of struct fsl_espi_transfer are part of struct
spi_transfer anyway. So we can get rid of struct fsl_espi_transfer
and use a struct spi_transfer only.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 56 +++++++++++++++++-----------------------------
1 file changed, 20 insertions(+), 36 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 726d5fd..8554f18 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -37,12 +37,6 @@ struct fsl_espi_reg {
__be32 csmode[4]; /* 0x020 - 0x02c eSPI cs mode register */
};
-struct fsl_espi_transfer {
- const void *tx_buf;
- void *rx_buf;
- unsigned len;
-};
-
/* eSPI Controller mode register definitions */
#define SPMODE_ENABLE (1 << 31)
#define SPMODE_LOOP (1 << 30)
@@ -267,17 +261,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count;
}
-static int fsl_espi_do_trans(struct spi_message *m,
- struct fsl_espi_transfer *tr)
+static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
- struct fsl_espi_transfer *espi_trans = tr;
- struct spi_transfer *t, *first, trans;
+ struct spi_transfer *t, *first;
int ret = 0;
- memset(&trans, 0, sizeof(trans));
-
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -288,25 +278,21 @@ static int fsl_espi_do_trans(struct spi_message *m,
return -EINVAL;
}
- trans.speed_hz = t->speed_hz;
- trans.bits_per_word = t->bits_per_word;
- trans.delay_usecs = max(first->delay_usecs, t->delay_usecs);
+ trans->speed_hz = t->speed_hz;
+ trans->bits_per_word = t->bits_per_word;
+ trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
}
- trans.len = espi_trans->len;
- trans.tx_buf = espi_trans->tx_buf;
- trans.rx_buf = espi_trans->rx_buf;
-
- fsl_espi_setup_transfer(spi, &trans);
+ fsl_espi_setup_transfer(spi, trans);
- if (trans.len)
- ret = fsl_espi_bufs(spi, &trans);
+ if (trans->len)
+ ret = fsl_espi_bufs(spi, trans);
if (ret)
ret = -EMSGSIZE;
- if (trans.delay_usecs)
- udelay(trans.delay_usecs);
+ if (trans->delay_usecs)
+ udelay(trans->delay_usecs);
fsl_espi_setup_transfer(spi, NULL);
@@ -314,23 +300,22 @@ static int fsl_espi_do_trans(struct spi_message *m,
}
static int fsl_espi_cmd_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- struct fsl_espi_transfer *espi_trans = trans;
int ret;
fsl_espi_copy_to_buf(m, mspi);
- espi_trans->tx_buf = mspi->local_buf;
- espi_trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, espi_trans);
+ trans->tx_buf = mspi->local_buf;
+ trans->rx_buf = mspi->local_buf;
+ ret = fsl_espi_do_trans(m, trans);
return ret;
}
static int fsl_espi_rw_trans(struct spi_message *m,
- struct fsl_espi_transfer *trans, u8 *rx_buff)
+ struct spi_transfer *trans, u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -355,10 +340,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
- struct spi_transfer *t;
u8 *rx_buf = NULL;
unsigned int xfer_len = 0;
- struct fsl_espi_transfer espi_trans;
+ struct spi_transfer *t, trans = {};
int ret;
list_for_each_entry(t, &m->transfers, transfer_list) {
@@ -368,14 +352,14 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
xfer_len += t->len;
}
- espi_trans.len = xfer_len;
+ trans.len = xfer_len;
if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &espi_trans, NULL);
+ ret = fsl_espi_cmd_trans(m, &trans, NULL);
else
- ret = fsl_espi_rw_trans(m, &espi_trans, rx_buf);
+ ret = fsl_espi_rw_trans(m, &trans, rx_buf);
- m->actual_length = ret ? 0 : espi_trans.len;
+ m->actual_length = ret ? 0 : trans.len;
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 07/15] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (60 preceding siblings ...)
2016-09-07 20:52 ` [PATCH v3 06/15] spi: fsl-espi: eliminate struct fsl_espi_transfer Heiner Kallweit
@ 2016-09-07 20:52 ` Heiner Kallweit
2016-09-07 20:52 ` [PATCH v3 08/15] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
` (7 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:52 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_cmd_trans and fsl_espi_rw_trans share most of the code so
we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8554f18..f8a6dd1 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -299,23 +299,8 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_cmd_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
- ret = fsl_espi_do_trans(m, trans);
-
- return ret;
-}
-
-static int fsl_espi_rw_trans(struct spi_message *m,
- struct spi_transfer *trans, u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
+ u8 *rx_buff)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
unsigned int tx_only;
@@ -327,12 +312,9 @@ static int fsl_espi_rw_trans(struct spi_message *m,
trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
- if (!ret) {
- /* If there is at least one RX byte then copy it to rx_buff */
- if (trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only,
- trans->len - tx_only);
- }
+ /* If there is at least one RX byte then copy it to rx_buff */
+ if (!ret && rx_buff && trans->len > tx_only)
+ memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
return ret;
}
@@ -354,10 +336,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.len = xfer_len;
- if (!rx_buf)
- ret = fsl_espi_cmd_trans(m, &trans, NULL);
- else
- ret = fsl_espi_rw_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 08/15] spi: fsl-espi: improve return value handling in fsl_espi_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (61 preceding siblings ...)
2016-09-07 20:52 ` [PATCH v3 07/15] spi: fsl-espi: merge fsl_espi_cmd_trans and fsl_espi_rw_trans Heiner Kallweit
@ 2016-09-07 20:52 ` Heiner Kallweit
2016-09-07 20:53 ` [PATCH v3 09/15] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
` (6 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:52 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Return a proper status code from fsl_espi_bufs instead of returning
the number of remaining words and let the caller evaluate it.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index f8a6dd1..8d6a570 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -258,7 +258,7 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
/* disable rx ints */
mpc8xxx_spi_write_reg(®_base->mask, 0);
- return mpc8xxx_spi->count;
+ return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
@@ -288,9 +288,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
if (trans->len)
ret = fsl_espi_bufs(spi, trans);
- if (ret)
- ret = -EMSGSIZE;
-
if (trans->delay_usecs)
udelay(trans->delay_usecs);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 09/15] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (62 preceding siblings ...)
2016-09-07 20:52 ` [PATCH v3 08/15] spi: fsl-espi: improve return value handling in fsl_espi_bufs Heiner Kallweit
@ 2016-09-07 20:53 ` Heiner Kallweit
2016-09-07 20:53 ` [PATCH v3 10/15] spi: fsl-espi: improve the ISR frame Heiner Kallweit
` (5 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:53 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
fsl_espi_bufs and fsl_espi_cpu_bufs are very small that we can merge them.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 27 ++++++++-------------------
1 file changed, 8 insertions(+), 19 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 8d6a570..190ca5c 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -206,31 +206,15 @@ static void fsl_espi_setup_transfer(struct spi_device *spi,
fsl_espi_change_mode(spi);
}
-static void fsl_espi_cpu_bufs(struct mpc8xxx_spi *mspi, struct spi_transfer *t,
- unsigned int len)
-{
- u32 word;
- struct fsl_espi_reg *reg_base = mspi->reg_base;
-
- mspi->count = len;
-
- /* enable rx ints */
- mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
-
- /* transmit word */
- word = mspi->get_tx(mspi);
- mpc8xxx_spi_write_reg(®_base->transmit, word);
-}
-
static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
{
struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master);
struct fsl_espi_reg *reg_base = mpc8xxx_spi->reg_base;
- unsigned int len = t->len;
+ u32 word;
int ret;
mpc8xxx_spi->len = t->len;
- len = roundup(len, 4) / 4;
+ mpc8xxx_spi->count = roundup(t->len, 4) / 4;
mpc8xxx_spi->tx = t->tx_buf;
mpc8xxx_spi->rx = t->rx_buf;
@@ -246,7 +230,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
- fsl_espi_cpu_bufs(mpc8xxx_spi, t, len);
+ /* enable rx ints */
+ mpc8xxx_spi_write_reg(®_base->mask, SPIM_NE);
+
+ /* transmit word */
+ word = mpc8xxx_spi->get_tx(mpc8xxx_spi);
+ mpc8xxx_spi_write_reg(®_base->transmit, word);
/* Won't hang up forever, SPI bus sometimes got lost interrupts... */
ret = wait_for_completion_timeout(&mpc8xxx_spi->done, 2 * HZ);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 10/15] spi: fsl-espi: improve the ISR frame
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (63 preceding siblings ...)
2016-09-07 20:53 ` [PATCH v3 09/15] spi: fsl-espi: merge fsl_espi_bufs and fsl_espi_cpu_bufs Heiner Kallweit
@ 2016-09-07 20:53 ` Heiner Kallweit
[not found] ` <7733dbde-1950-d6e3-6d71-975b25d6ded1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2016-09-07 20:53 ` [PATCH v3 11/15] spi: fsl-espi: factor out initial message checking Heiner Kallweit
` (4 subsequent siblings)
69 siblings, 1 reply; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:53 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Improve the ISR frame:
- move resetting the event bits to the ISR frame
- change type of parameter irq to int
- make sure that the event bits match at least one bit in the
interrupt mask register
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 190ca5c..534dc14 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -451,17 +451,11 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
®_base->event)) & SPIE_NF), 1000, 0);
if (!ret) {
dev_err(mspi->dev, "tired waiting for SPIE_NF\n");
-
- /* Clear the SPIE bits */
- mpc8xxx_spi_write_reg(®_base->event, events);
complete(&mspi->done);
return;
}
}
- /* Clear the events */
- mpc8xxx_spi_write_reg(®_base->event, events);
-
mspi->count -= 1;
if (mspi->count) {
u32 word = mspi->get_tx(mspi);
@@ -472,23 +466,26 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
}
}
-static irqreturn_t fsl_espi_irq(s32 irq, void *context_data)
+static irqreturn_t fsl_espi_irq(int irq, void *context_data)
{
struct mpc8xxx_spi *mspi = context_data;
struct fsl_espi_reg *reg_base = mspi->reg_base;
- irqreturn_t ret = IRQ_NONE;
- u32 events;
+ u32 mask, events;
- /* Get interrupt events(tx/rx) */
+ /* Get interrupt mask and events and check that irq belongs to us */
+ mask = mpc8xxx_spi_read_reg(®_base->mask);
events = mpc8xxx_spi_read_reg(®_base->event);
- if (events)
- ret = IRQ_HANDLED;
+ if (!(mask & events))
+ return IRQ_NONE;
dev_vdbg(mspi->dev, "%s: events %x\n", __func__, events);
fsl_espi_cpu_irq(mspi, events);
- return ret;
+ /* Clear the events */
+ mpc8xxx_spi_write_reg(®_base->event, events);
+
+ return IRQ_HANDLED;
}
#ifdef CONFIG_PM
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 11/15] spi: fsl-espi: factor out initial message checking
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (64 preceding siblings ...)
2016-09-07 20:53 ` [PATCH v3 10/15] spi: fsl-espi: improve the ISR frame Heiner Kallweit
@ 2016-09-07 20:53 ` Heiner Kallweit
2016-09-07 20:54 ` [PATCH v3 12/15] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
` (3 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:53 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Checking the message is currently done at diffrent places in the
driver. Factor it out to fsl_espi_check_message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 43 +++++++++++++++++++++++++++++--------------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 534dc14..a32bc3a 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -98,6 +98,30 @@ static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
return tx_only;
}
+static int fsl_espi_check_message(struct spi_message *m)
+{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
+ struct spi_transfer *t, *first;
+
+ if (m->frame_length > SPCOM_TRANLEN_MAX) {
+ dev_err(mspi->dev, "message too long, size is %u bytes\n",
+ m->frame_length);
+ return -EMSGSIZE;
+ }
+
+ first = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (first->bits_per_word != t->bits_per_word ||
+ first->speed_hz != t->speed_hz) {
+ dev_err(mspi->dev, "bits_per_word/speed_hz should be the same for all transfers\n");
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
static void fsl_espi_change_mode(struct spi_device *spi)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
@@ -222,11 +246,6 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
reinit_completion(&mpc8xxx_spi->done);
/* Set SPCOM[CS] and SPCOM[TRANLEN] field */
- if (t->len > SPCOM_TRANLEN_MAX) {
- dev_err(mpc8xxx_spi->dev, "Transaction length (%d)"
- " beyond the SPCOM[TRANLEN] field\n", t->len);
- return -EINVAL;
- }
mpc8xxx_spi_write_reg(®_base->command,
(SPCOM_CS(spi->chip_select) | SPCOM_TRANLEN(t->len - 1)));
@@ -253,20 +272,12 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master);
struct spi_transfer *t, *first;
int ret = 0;
first = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((first->bits_per_word != t->bits_per_word) ||
- (first->speed_hz != t->speed_hz)) {
- dev_err(mspi->dev,
- "bits_per_word/speed_hz should be same for the same SPI transfer\n");
- return -EINVAL;
- }
-
trans->speed_hz = t->speed_hz;
trans->bits_per_word = t->bits_per_word;
trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
@@ -313,6 +324,10 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_transfer *t, trans = {};
int ret;
+ ret = fsl_espi_check_message(m);
+ if (ret)
+ goto out;
+
list_for_each_entry(t, &m->transfers, transfer_list) {
if (t->rx_buf)
rx_buf = t->rx_buf;
@@ -325,7 +340,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
ret = fsl_espi_trans(m, &trans, rx_buf);
m->actual_length = ret ? 0 : trans.len;
-
+out:
if (m->status == -EINPROGRESS)
m->status = ret;
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 12/15] spi: fsl-espi: centralize populating struct spi_transfer
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (65 preceding siblings ...)
2016-09-07 20:53 ` [PATCH v3 11/15] spi: fsl-espi: factor out initial message checking Heiner Kallweit
@ 2016-09-07 20:54 ` Heiner Kallweit
2016-09-07 20:54 ` [PATCH v3 13/15] spi: fsl-espi: factor out handling of read data Heiner Kallweit
` (2 subsequent siblings)
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:54 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Better structure the code by population all elements of struct
spi_transfer in one place.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index a32bc3a..79c89bf 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -272,17 +272,8 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct spi_device *spi = m->spi;
- struct spi_transfer *t, *first;
int ret = 0;
- first = list_first_entry(&m->transfers, struct spi_transfer,
- transfer_list);
- list_for_each_entry(t, &m->transfers, transfer_list) {
- trans->speed_hz = t->speed_hz;
- trans->bits_per_word = t->bits_per_word;
- trans->delay_usecs = max(first->delay_usecs, t->delay_usecs);
- }
-
fsl_espi_setup_transfer(spi, trans);
if (trans->len)
@@ -305,8 +296,6 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
tx_only = fsl_espi_copy_to_buf(m, mspi);
- trans->tx_buf = mspi->local_buf;
- trans->rx_buf = mspi->local_buf;
ret = fsl_espi_do_trans(m, trans);
/* If there is at least one RX byte then copy it to rx_buff */
@@ -319,8 +308,9 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
u8 *rx_buf = NULL;
- unsigned int xfer_len = 0;
+ unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -333,9 +323,19 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
+ if (t->delay_usecs > delay_usecs)
+ delay_usecs = t->delay_usecs;
}
+ t = list_first_entry(&m->transfers, struct spi_transfer,
+ transfer_list);
+
trans.len = xfer_len;
+ trans.speed_hz = t->speed_hz;
+ trans.bits_per_word = t->bits_per_word;
+ trans.delay_usecs = delay_usecs;
+ trans.tx_buf = mspi->local_buf;
+ trans.rx_buf = mspi->local_buf;
ret = fsl_espi_trans(m, &trans, rx_buf);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 13/15] spi: fsl-espi: factor out handling of read data
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (66 preceding siblings ...)
2016-09-07 20:54 ` [PATCH v3 12/15] spi: fsl-espi: centralize populating struct spi_transfer Heiner Kallweit
@ 2016-09-07 20:54 ` Heiner Kallweit
2016-09-07 20:54 ` [PATCH v3 14/15] spi: fsl-espi: improve message length handling Heiner Kallweit
2016-09-07 20:54 ` [PATCH v3 15/15] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:54 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Factor out copying read data to the read buffers in the original
message to a new function fsl_espi_copy_from_buf.
This also allows to simplify fsl_espi_copy_to_buf.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 41 +++++++++++++++++++++--------------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 79c89bf..88935a3 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -77,25 +77,32 @@ struct fsl_espi_reg {
#define AUTOSUSPEND_TIMEOUT 2000
-static unsigned int fsl_espi_copy_to_buf(struct spi_message *m,
- struct mpc8xxx_spi *mspi)
+static void fsl_espi_copy_to_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
{
- unsigned int tx_only = 0;
struct spi_transfer *t;
u8 *buf = mspi->local_buf;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->tx_buf) {
+ if (t->tx_buf)
memcpy(buf, t->tx_buf, t->len);
- if (!t->rx_buf)
- tx_only += t->len;
- } else {
+ else
memset(buf, 0, t->len);
- }
buf += t->len;
}
+}
+
+static void fsl_espi_copy_from_buf(struct spi_message *m,
+ struct mpc8xxx_spi *mspi)
+{
+ struct spi_transfer *t;
+ u8 *buf = mspi->local_buf;
- return tx_only;
+ list_for_each_entry(t, &m->transfers, transfer_list) {
+ if (t->rx_buf)
+ memcpy(t->rx_buf, buf, t->len);
+ buf += t->len;
+ }
}
static int fsl_espi_check_message(struct spi_message *m)
@@ -287,20 +294,17 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
return ret;
}
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans,
- u8 *rx_buff)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int tx_only;
int ret;
- tx_only = fsl_espi_copy_to_buf(m, mspi);
+ fsl_espi_copy_to_buf(m, mspi);
ret = fsl_espi_do_trans(m, trans);
- /* If there is at least one RX byte then copy it to rx_buff */
- if (!ret && rx_buff && trans->len > tx_only)
- memcpy(rx_buff, trans->rx_buf + tx_only, trans->len - tx_only);
+ if (!ret)
+ fsl_espi_copy_from_buf(m, mspi);
return ret;
}
@@ -309,7 +313,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- u8 *rx_buf = NULL;
unsigned int delay_usecs = 0, xfer_len = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -319,8 +322,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if (t->rx_buf)
- rx_buf = t->rx_buf;
if ((t->tx_buf) || (t->rx_buf))
xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
@@ -337,7 +338,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans, rx_buf);
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 14/15] spi: fsl-espi: improve message length handling
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (67 preceding siblings ...)
2016-09-07 20:54 ` [PATCH v3 13/15] spi: fsl-espi: factor out handling of read data Heiner Kallweit
@ 2016-09-07 20:54 ` Heiner Kallweit
2016-09-07 20:54 ` [PATCH v3 15/15] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans Heiner Kallweit
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:54 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Move checking for a zero-length message up in the call chain and
use m->frame_length instead of re-calculating the overall length
of all transfers in the message.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 88935a3..84355bb 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -283,8 +283,7 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, trans);
- if (trans->len)
- ret = fsl_espi_bufs(spi, trans);
+ ret = fsl_espi_bufs(spi, trans);
if (trans->delay_usecs)
udelay(trans->delay_usecs);
@@ -313,7 +312,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
struct spi_message *m)
{
struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- unsigned int delay_usecs = 0, xfer_len = 0;
+ unsigned int delay_usecs = 0;
struct spi_transfer *t, trans = {};
int ret;
@@ -322,8 +321,6 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
goto out;
list_for_each_entry(t, &m->transfers, transfer_list) {
- if ((t->tx_buf) || (t->rx_buf))
- xfer_len += t->len;
if (t->delay_usecs > delay_usecs)
delay_usecs = t->delay_usecs;
}
@@ -331,14 +328,15 @@ static int fsl_espi_do_one_msg(struct spi_master *master,
t = list_first_entry(&m->transfers, struct spi_transfer,
transfer_list);
- trans.len = xfer_len;
+ trans.len = m->frame_length;
trans.speed_hz = t->speed_hz;
trans.bits_per_word = t->bits_per_word;
trans.delay_usecs = delay_usecs;
trans.tx_buf = mspi->local_buf;
trans.rx_buf = mspi->local_buf;
- ret = fsl_espi_trans(m, &trans);
+ if (trans.len)
+ ret = fsl_espi_trans(m, &trans);
m->actual_length = ret ? 0 : trans.len;
out:
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread
* [PATCH v3 15/15] spi: fsl-espi: merge fsl_espi_trans and fsl_espi_do_trans
[not found] ` <e5c7d6cd-0ba1-b1ec-60a8-72d6e2607217-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (68 preceding siblings ...)
2016-09-07 20:54 ` [PATCH v3 14/15] spi: fsl-espi: improve message length handling Heiner Kallweit
@ 2016-09-07 20:54 ` Heiner Kallweit
69 siblings, 0 replies; 110+ messages in thread
From: Heiner Kallweit @ 2016-09-07 20:54 UTC (permalink / raw)
To: Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA
Merge both functions to reduce source code size and improve
readability.
Signed-off-by: Heiner Kallweit <hkallweit1-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
v2:
- rebased
v3:
- new numbering
---
drivers/spi/spi-fsl-espi.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 84355bb..f7d682f 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -276,11 +276,13 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t)
return mpc8xxx_spi->count > 0 ? -EMSGSIZE : 0;
}
-static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
+static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
{
+ struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
struct spi_device *spi = m->spi;
- int ret = 0;
+ int ret;
+ fsl_espi_copy_to_buf(m, mspi);
fsl_espi_setup_transfer(spi, trans);
ret = fsl_espi_bufs(spi, trans);
@@ -290,18 +292,6 @@ static int fsl_espi_do_trans(struct spi_message *m, struct spi_transfer *trans)
fsl_espi_setup_transfer(spi, NULL);
- return ret;
-}
-
-static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans)
-{
- struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master);
- int ret;
-
- fsl_espi_copy_to_buf(m, mspi);
-
- ret = fsl_espi_do_trans(m, trans);
-
if (!ret)
fsl_espi_copy_from_buf(m, mspi);
--
2.9.2
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 110+ messages in thread