Skip to contentSkip to conversation

spi: mxs: Introduce spi_cs_is_valid()

PATCH New Fabio Estevam 4 participants 7 messages Apr 23, 2012 – May 9, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v2 1/2 spi: mxs: Introduce spi_cs_is_valid()

Introduce spi_cs_is_valid() for validating spi bus and chip select numbers.

---
Changes since v1:
- Newly introduced in v2

 drivers/spi/mxs_spi.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)
drivers/spi/mxs_spi.c +11 -2
index 4e6f14e..e7237e7 100644
@@ -51,14 +51,23 @@ void spi_init(void)
 {
 }
 
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+	/* MXS SPI: 4 ports and 3 chip selects maximum */
+	if (bus > 3 || cs > 2)
+		return 0;
+	else
+		return 1;
+}
+
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 				  unsigned int max_hz, unsigned int mode)
 {
 	struct mxs_spi_slave *mxs_slave;
 	uint32_t addr;
 
-	if (bus > 3) {
-		printf("MXS SPI: Max bus number is 3\n");
+	if (!spi_cs_is_valid(bus, cs)) {
+		printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs);
 		return NULL;
 	}
 
Signature · 1 line
1.7.1
#1 lore raw

PATCH v2 2/2 spi: mxs: Allow other chip selects to work

MXS SSP controller may have up to three chip selects per port: SS0, SS1 and SS2.

Currently only SS0 is supported in the mxs_spi driver.

Allow all the three chip select to work by selecting the desired one in bits 20 and 21 of the HW_SSP_CTRL0 register.

---
Changes since v1:
- Check vor valid cs inside spi_cs_is_valid() (patch 1/2)

 drivers/spi/mxs_spi.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
drivers/spi/mxs_spi.c +10 -0
index e7237e7..7859536 100644
@@ -34,6 +34,8 @@
 
 #define	MXS_SPI_MAX_TIMEOUT	1000000
 #define	MXS_SPI_PORT_OFFSET	0x2000
+#define MXS_SSP_CHIPSELECT_MASK		0x00300000
+#define MXS_SSP_CHIPSELECT_SHIFT	20
 
 struct mxs_spi_slave {
 	struct spi_slave	slave;
@@ -65,6 +67,8 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 {
 	struct mxs_spi_slave *mxs_slave;
 	uint32_t addr;
+	struct mx28_ssp_regs *ssp_regs;
+	int reg;
 
 	if (!spi_cs_is_valid(bus, cs)) {
 		printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs);
@@ -82,7 +86,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 	mxs_slave->max_khz = max_hz / 1000;
 	mxs_slave->mode = mode;
 	mxs_slave->regs = (struct mx28_ssp_regs *)addr;
+	ssp_regs = mxs_slave->regs;
 
+	reg = readl(&ssp_regs->hw_ssp_ctrl0);
+	reg &= ~(MXS_SSP_CHIPSELECT_MASK);
+	reg |= cs << MXS_SSP_CHIPSELECT_SHIFT;
+
+	writel(reg, &ssp_regs->hw_ssp_ctrl0);
 	return &mxs_slave->slave;
 }
 
Signature · 1 line
1.7.1
#2 lore raw

PATCH v2 2/2 spi: mxs: Allow other chip selects to work

Dear Fabio Estevam,

Quoted 9 lines

MXS SSP controller may have up to three chip selects per port: SS0, SS1 and SS2.

Currently only SS0 is supported in the mxs_spi driver.

Allow all the three chip select to work by selecting the desired one in bits 20 and 21 of the HW_SSP_CTRL0 register.

Quoted 32 lines

---
Changes since v1:
- Check vor valid cs inside spi_cs_is_valid() (patch 1/2)

 drivers/spi/mxs_spi.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
drivers/spi/mxs_spi.c +4 -0
index e7237e7..7859536 100644
@@ -34,6 +34,8 @@
 
 #define	MXS_SPI_MAX_TIMEOUT	1000000
 #define	MXS_SPI_PORT_OFFSET	0x2000
+#define MXS_SSP_CHIPSELECT_MASK		0x00300000
+#define MXS_SSP_CHIPSELECT_SHIFT	20
 
 struct mxs_spi_slave {
 	struct spi_slave	slave;
@@ -65,6 +67,8 @@ struct spi_slave *spi_setup_slave(unsigned int bus,
 unsigned int cs, {
 	struct mxs_spi_slave *mxs_slave;
 	uint32_t addr;
+	struct mx28_ssp_regs *ssp_regs;
+	int reg;
 
 	if (!spi_cs_is_valid(bus, cs)) {
 		printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs);
@@ -82,7 +86,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus,
 unsigned int cs, mxs_slave->max_khz = max_hz / 1000;
 	mxs_slave->mode = mode;

drivers/spi/mxs_spi.c struct spi_slave *spi_setup_slave(unsigned int bus, · line 97

Quoted 10 lines
drivers/spi/mxs_spi.c +6 -0
 	mxs_slave->regs = (struct mx28_ssp_regs *)addr;
+	ssp_regs = mxs_slave->regs;
 
+	reg = readl(&ssp_regs->hw_ssp_ctrl0);
+	reg &= ~(MXS_SSP_CHIPSELECT_MASK);
+	reg |= cs << MXS_SSP_CHIPSELECT_SHIFT;
+
+	writel(reg, &ssp_regs->hw_ssp_ctrl0);
 	return &mxs_slave->slave;
 }

Best regards,
Marek Vasut

#3 lore raw

PATCH v2 2/2 spi: mxs: Allow other chip selects to work

In reply to Fabio Estevam
Quoted 9 lines · Fabio Estevam

MXS SSP controller may have up to three chip selects per port: SS0, SS1 and SS2.

Currently only SS0 is supported in the mxs_spi driver.

Allow all the three chip select to work by selecting the desired one in bits 20 and 21 of the HW_SSP_CTRL0 register.

---

Applied to u-boot-imx, thanks.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#4 lore raw

PATCH v2 1/2 spi: mxs: Introduce spi_cs_is_valid()

In reply to Fabio Estevam

Dear Fabio Estevam,

Quoted 3 lines

Introduce spi_cs_is_valid() for validating spi bus and chip select numbers.

Quoted 26 lines

---
Changes since v1:
- Newly introduced in v2

 drivers/spi/mxs_spi.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)
drivers/spi/mxs_spi.c +9 -0
index 4e6f14e..e7237e7 100644
@@ -51,14 +51,23 @@ void spi_init(void)
 {
 }
 
+int spi_cs_is_valid(unsigned int bus, unsigned int cs)
+{
+	/* MXS SPI: 4 ports and 3 chip selects maximum */
+	if (bus > 3 || cs > 2)
+		return 0;
+	else
+		return 1;
+}
+
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 				  unsigned int max_hz, unsigned int mode)

drivers/spi/mxs_spi.c void spi_init(void) · line 72

Quoted 10 lines
drivers/spi/mxs_spi.c +2 -2
 {
 	struct mxs_spi_slave *mxs_slave;
 	uint32_t addr;
 
-	if (bus > 3) {
-		printf("MXS SPI: Max bus number is 3\n");
+	if (!spi_cs_is_valid(bus, cs)) {
+		printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs);
 		return NULL;
 	}

Best regards,
Marek Vasut

#5 lore raw

PATCH v2 1/2 spi: mxs: Introduce spi_cs_is_valid()

In reply to Fabio Estevam
Quoted 1 line · On Monday 23 April 2012 14:30:49 Fabio Estevam wrote:

Introduce spi_cs_is_valid() for validating spi bus and chip select numbers.

-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120423/15a143ee/attachment.pgp>

#6 lore raw

PATCH v2 1/2 spi: mxs: Introduce spi_cs_is_valid()

In reply to Fabio Estevam
Quoted 4 lines · Fabio Estevam

Introduce spi_cs_is_valid() for validating spi bus and chip select numbers.

---

Applied to u-boot-imx, thanks.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================