All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes
@ 2014-10-23 14:09 Markus Niebel
  2014-10-23 14:09 ` [U-Boot] [PATCH v2 1/2] SPI: mxc_spi: remove second reset from ECSPI config handler Markus Niebel
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Markus Niebel @ 2014-10-23 14:09 UTC (permalink / raw)
  To: u-boot

From: Markus Niebel <Markus.Niebel@tq-group.com>

current implementation of the mxc_spi host driver gives issues,
if using more than one slave on the same bus. These patches try
to improve this use case.

They were tested on a TQMa6S (i.MX6S) with a custom mainboard
using two slave devices in SPI MODE 0 and 3, on of the devices
uses gpio based chip select the other hardware base chip select.

Markus Niebel (2):
  SPI: mxc_spi: remove second reset from ECSPI config handler
  SPI: mxc_spi: delay initialisation until claim bus

 drivers/spi/mxc_spi.c | 40 +++++++++++++++++++++-------------------
 1 file changed, 21 insertions(+), 19 deletions(-)

-- 

Changes since v1:

- fix typo

2.1.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH v2 1/2] SPI: mxc_spi: remove second reset from ECSPI config handler
  2014-10-23 14:09 [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Markus Niebel
@ 2014-10-23 14:09 ` Markus Niebel
  2014-10-23 14:09 ` [U-Boot] [PATCH v2 2/2] SPI: mxc_spi: delay initialisation until claim bus Markus Niebel
  2014-10-27 17:12 ` [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Jagan Teki
  2 siblings, 0 replies; 4+ messages in thread
From: Markus Niebel @ 2014-10-23 14:09 UTC (permalink / raw)
  To: u-boot

From: Markus Niebel <Markus.Niebel@tq-group.com>

the second reset prevents other registers to be written.
This will prevent to have the correct signal levels for
SCLK before writing to the config reg in spi_xchg_single.

Tested with GPIO based chipselect and SPI_MODE_3 on i.MX6S

Signed-off-by: Markus Niebel <Markus.Niebel@tq-group.com>
---
Changes since v1:
- rebase to current master

 drivers/spi/mxc_spi.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
index 026f680..555b34f 100644
--- a/drivers/spi/mxc_spi.c
+++ b/drivers/spi/mxc_spi.c
@@ -168,9 +168,6 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
 	reg_ctrl = (reg_ctrl & ~MXC_CSPICTRL_POSTDIV(0x0F)) |
 		MXC_CSPICTRL_POSTDIV(post_div);
 
-	/* We need to disable SPI before changing registers */
-	reg_ctrl &= ~MXC_CSPICTRL_EN;
-
 	if (mode & SPI_CS_HIGH)
 		ss_pol = 1;
 
-- 
2.1.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH v2 2/2] SPI: mxc_spi: delay initialisation until claim bus
  2014-10-23 14:09 [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Markus Niebel
  2014-10-23 14:09 ` [U-Boot] [PATCH v2 1/2] SPI: mxc_spi: remove second reset from ECSPI config handler Markus Niebel
@ 2014-10-23 14:09 ` Markus Niebel
  2014-10-27 17:12 ` [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Jagan Teki
  2 siblings, 0 replies; 4+ messages in thread
From: Markus Niebel @ 2014-10-23 14:09 UTC (permalink / raw)
  To: u-boot

From: Markus Niebel <Markus.Niebel@tq-group.com>

it is not correct to init for a specific slave in spi_setup_slave.
instead buffer the values and delay init until spi_claim_bus.

Signed-off-by: Markus Niebel <Markus.Niebel@tq-group.com>
---
Changes since v1:
- rebase to current master

 drivers/spi/mxc_spi.c | 37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
index 555b34f..e04a30f 100644
--- a/drivers/spi/mxc_spi.c
+++ b/drivers/spi/mxc_spi.c
@@ -48,6 +48,8 @@ struct mxc_spi_slave {
 #endif
 	int		gpio;
 	int		ss_pol;
+	unsigned int	max_hz;
+	unsigned int	mode;
 };
 
 static inline struct mxc_spi_slave *to_mxc_spi_slave(struct spi_slave *slave)
@@ -82,12 +84,13 @@ u32 get_cspi_div(u32 div)
 }
 
 #ifdef MXC_CSPI
-static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
-		unsigned int max_hz, unsigned int mode)
+static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs)
 {
 	unsigned int ctrl_reg;
 	u32 clk_src;
 	u32 div;
+	unsigned int max_hz = mxcs->max_hz;
+	unsigned int mode = mxcs->mode;
 
 	clk_src = mxc_get_clock(MXC_CSPI_CLK);
 
@@ -119,19 +122,15 @@ static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
 #endif
 
 #ifdef MXC_ECSPI
-static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs,
-		unsigned int max_hz, unsigned int mode)
+static s32 spi_cfg_mxc(struct mxc_spi_slave *mxcs, unsigned int cs)
 {
 	u32 clk_src = mxc_get_clock(MXC_CSPI_CLK);
 	s32 reg_ctrl, reg_config;
 	u32 ss_pol = 0, sclkpol = 0, sclkpha = 0, sclkctl = 0;
 	u32 pre_div = 0, post_div = 0;
 	struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
-
-	if (max_hz == 0) {
-		printf("Error: desired clock is 0\n");
-		return -1;
-	}
+	unsigned int max_hz = mxcs->max_hz;
+	unsigned int mode = mxcs->mode;
 
 	/*
 	 * Reset SPI and set all CSs to master mode, if toggling
@@ -408,6 +407,11 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 	if (bus >= ARRAY_SIZE(spi_bases))
 		return NULL;
 
+	if (max_hz == 0) {
+		printf("Error: desired clock is 0\n");
+		return NULL;
+	}
+
 	mxcs = spi_alloc_slave(struct mxc_spi_slave, bus, cs);
 	if (!mxcs) {
 		puts("mxc_spi: SPI Slave not allocated !\n");
@@ -423,13 +427,9 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 	}
 
 	mxcs->base = spi_bases[bus];
+	mxcs->max_hz = max_hz;
+	mxcs->mode = mode;
 
-	ret = spi_cfg_mxc(mxcs, cs, max_hz, mode);
-	if (ret) {
-		printf("mxc_spi: cannot setup SPI controller\n");
-		free(mxcs);
-		return NULL;
-	}
 	return &mxcs->slave;
 }
 
@@ -442,12 +442,17 @@ void spi_free_slave(struct spi_slave *slave)
 
 int spi_claim_bus(struct spi_slave *slave)
 {
+	int ret;
 	struct mxc_spi_slave *mxcs = to_mxc_spi_slave(slave);
 	struct cspi_regs *regs = (struct cspi_regs *)mxcs->base;
 
 	reg_write(&regs->rxdata, 1);
 	udelay(1);
-	reg_write(&regs->ctrl, mxcs->ctrl_reg);
+	ret = spi_cfg_mxc(mxcs, slave->cs);
+	if (ret) {
+		printf("mxc_spi: cannot setup SPI controller\n");
+		return ret;
+	}
 	reg_write(&regs->period, MXC_CSPIPERIOD_32KHZ);
 	reg_write(&regs->intr, 0);
 
-- 
2.1.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes
  2014-10-23 14:09 [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Markus Niebel
  2014-10-23 14:09 ` [U-Boot] [PATCH v2 1/2] SPI: mxc_spi: remove second reset from ECSPI config handler Markus Niebel
  2014-10-23 14:09 ` [U-Boot] [PATCH v2 2/2] SPI: mxc_spi: delay initialisation until claim bus Markus Niebel
@ 2014-10-27 17:12 ` Jagan Teki
  2 siblings, 0 replies; 4+ messages in thread
From: Jagan Teki @ 2014-10-27 17:12 UTC (permalink / raw)
  To: u-boot

On 23 October 2014 19:39, Markus Niebel <list-09_u-boot@tqsc.de> wrote:
> From: Markus Niebel <Markus.Niebel@tq-group.com>
>
> current implementation of the mxc_spi host driver gives issues,
> if using more than one slave on the same bus. These patches try
> to improve this use case.
>
> They were tested on a TQMa6S (i.MX6S) with a custom mainboard
> using two slave devices in SPI MODE 0 and 3, on of the devices
> uses gpio based chip select the other hardware base chip select.
>
> Markus Niebel (2):
>   SPI: mxc_spi: remove second reset from ECSPI config handler
>   SPI: mxc_spi: delay initialisation until claim bus
>
>  drivers/spi/mxc_spi.c | 40 +++++++++++++++++++++-------------------
>  1 file changed, 21 insertions(+), 19 deletions(-)

Applied to u-boot-spi/master

thanks!
-- 
Jagan.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-10-27 17:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-23 14:09 [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Markus Niebel
2014-10-23 14:09 ` [U-Boot] [PATCH v2 1/2] SPI: mxc_spi: remove second reset from ECSPI config handler Markus Niebel
2014-10-23 14:09 ` [U-Boot] [PATCH v2 2/2] SPI: mxc_spi: delay initialisation until claim bus Markus Niebel
2014-10-27 17:12 ` [U-Boot] [PATCH v2 0/2] SPI: mxc_spi: slave initialisation fixes Jagan Teki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.