Skip to contentSkip to conversation

spi: soft_spi: Fix for soft_spi

PATCH Superseded Horatiu Vultur 2 participants 5 messages Jan 7, 2019 SPI

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 spi: soft_spi: Fix for soft_spi

This patch series, fix a null ptr inside soft_spi.

This version address comments from Jagan Teki
<[email protected]>

v2 changes:
- update soft_spi_platdata inside .set_mode.

Horatiu Vultur (1):
spi: soft_spi: Fix null ptr when probing soft_spi.

 drivers/spi/soft_spi.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
Signature · 1 line
2.7.4
#1 lore raw

PATCH v2 1/1 spi: soft_spi: Fix for soft_spi

This patch series, fix a null ptr inside soft_spi.

This version address comments from Jagan Teki
<[email protected]>

v2 changes:
- update soft_spi_platdata inside .set_mode.

Horatiu Vultur (1):
spi: soft_spi: Fix null ptr when probing soft_spi.

 drivers/spi/soft_spi.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
Signature · 1 line
2.7.4
#2 lore raw

PATCH v2 1/1 spi: soft_spi: Fix null ptr when probing soft_spi.

In reply to Horatiu Vultur

When probing soft_spi the result of dev_get_parent_priv(dev) in probe function is null ptr because the spi is on the ahb bus which has per_child_auto_alloc_size set to 0. Therefore it would generate an Ooops messages when accessing spi_slave structure.

The fix consist of updating the soft_spi_platdata flags inside the .set_mode.

---
 drivers/spi/soft_spi.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/spi/soft_spi.c +8 -7
index b06883f..2c47577 100644
@@ -183,9 +183,15 @@ static int soft_spi_set_speed(struct udevice *dev, unsigned int speed)
 static int soft_spi_set_mode(struct udevice *dev, unsigned int mode)
 {
 	struct soft_spi_priv *priv = dev_get_priv(dev);
+	struct soft_spi_platdata *plat = dev->platdata;
 
 	priv->mode = mode;
 
+	if (!(mode & SPI_CS_HIGH))
+		plat->cs.flags |= GPIOD_ACTIVE_LOW;
+	if (mode & SPI_CPOL)
+		plat->sclk.flags |= GPIOD_ACTIVE_LOW;
+
 	return 0;
 }
 
@@ -210,18 +216,13 @@ static int soft_spi_ofdata_to_platdata(struct udevice *dev)
 
 static int soft_spi_probe(struct udevice *dev)
 {
-	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct soft_spi_platdata *plat = dev->platdata;
-	int cs_flags, clk_flags;
 	int ret;
 
-	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
-	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
-
 	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
-				 GPIOD_IS_OUT | cs_flags) ||
+				 GPIOD_IS_OUT) ||
 	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
-				 GPIOD_IS_OUT | clk_flags))
+				 GPIOD_IS_OUT))
 		return -EINVAL;
 
 	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
Signature · 1 line
2.7.4
#3 lore raw

PATCH v2 1/1 spi: soft_spi: Fix null ptr when probing soft_spi.

Am 07.01.19 um 09:20 schrieb Horatiu Vultur:

Quoted 5 lines

When probing soft_spi the result of dev_get_parent_priv(dev) in probe function is null ptr because the spi is on the ahb bus which has per_child_auto_alloc_size set to 0. Therefore it would generate an Ooops messages when accessing spi_slave structure.

Quoted 7 lines

The fix consist of updating the soft_spi_platdata flags inside the .set_mode.

---
 drivers/spi/soft_spi.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

is this patch still required with https://patchwork.ozlabs.org/cover/1021335/ ?

Quoted 8 lines
drivers/spi/soft_spi.c +0 -0
index b06883f..2c47577 100644
@@ -183,9 +183,15 @@ static int soft_spi_set_speed(struct udevice *dev, unsigned int speed)
 static int soft_spi_set_mode(struct udevice *dev, unsigned int mode)
 {

drivers/spi/soft_spi.c static int soft_spi_set_speed(struct udevice *dev, unsigned int speed) · line 194

Quoted 10 lines
drivers/spi/soft_spi.c +6 -0
 	struct soft_spi_priv *priv = dev_get_priv(dev);
+	struct soft_spi_platdata *plat = dev->platdata;
 
 	priv->mode = mode;
 
+	if (!(mode & SPI_CS_HIGH))
+		plat->cs.flags |= GPIOD_ACTIVE_LOW;
+	if (mode & SPI_CPOL)
+		plat->sclk.flags |= GPIOD_ACTIVE_LOW;
+

don't you need to manually set the initial state of CS and CLK now? This was previously done by gpio_request_by_name(). That's why the driver needed to know the low-active bits early.

Quoted 25 lines
drivers/spi/soft_spi.c +2 -7
 	return 0;
 }
 
@@ -210,18 +216,13 @@ static int soft_spi_ofdata_to_platdata(struct udevice *dev)
 
 static int soft_spi_probe(struct udevice *dev)
 {
-	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct soft_spi_platdata *plat = dev->platdata;
-	int cs_flags, clk_flags;
 	int ret;
 
-	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
-	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
-
 	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
-				 GPIOD_IS_OUT | cs_flags) ||
+				 GPIOD_IS_OUT) ||
 	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
-				 GPIOD_IS_OUT | clk_flags))
+				 GPIOD_IS_OUT))
 		return -EINVAL;
 
 	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
Signature · 1 line
- Daniel
#4 lore raw

PATCH v2 1/1 spi: soft_spi: Fix null ptr when probing soft_spi.

Quoted 11 lines · Daniel Schwierzeck

Am 07.01.19 um 09:20 schrieb Horatiu Vultur:

Quoted 8 lines

When probing soft_spi the result of dev_get_parent_priv(dev) in probe function is null ptr because the spi is on the ahb bus which has per_child_auto_alloc_size set to 0. Therefore it would generate an Ooops messages when accessing spi_slave structure.

The fix consist of updating the soft_spi_platdata flags inside the .set_mode.

Quoted 6 lines
Quoted 4 lines
---
 drivers/spi/soft_spi.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

is this patch still required with https://patchwork.ozlabs.org/cover/1021335/ ?

This patch is not required if you will take in
https://patchwork.ozlabs.org/cover/1021335.

Quoted 14 lines
Quoted 14 lines
drivers/spi/soft_spi.c +1 -0
index b06883f..2c47577 100644
@@ -183,9 +183,15 @@ static int soft_spi_set_speed(struct udevice *dev, unsigned int speed)
 static int soft_spi_set_mode(struct udevice *dev, unsigned int mode)
 {
 	struct soft_spi_priv *priv = dev_get_priv(dev);
+	struct soft_spi_platdata *plat = dev->platdata;
 
 	priv->mode = mode;
 
Quoted 8 lines

drivers/spi/soft_spi.c static int soft_spi_set_speed(struct udevice *dev, unsigned int speed) · line 194

Quoted 5 lines
drivers/spi/soft_spi.c +5 -0
+	if (!(mode & SPI_CS_HIGH))
+		plat->cs.flags |= GPIOD_ACTIVE_LOW;
+	if (mode & SPI_CPOL)
+		plat->sclk.flags |= GPIOD_ACTIVE_LOW;
+

don't you need to manually set the initial state of CS and CLK now? This was previously done by gpio_request_by_name(). That's why the driver needed to know the low-active bits early.

No, because it is still using gpio_request_by_name() and that one will set the initial values for CS and CLK. And now in the .set_mode() we just update the CS and CLK, which is called before probing the spi.

Quoted 29 lines
Quoted 26 lines
drivers/spi/soft_spi.c +2 -7
 	return 0;
 }
 
@@ -210,18 +216,13 @@ static int soft_spi_ofdata_to_platdata(struct udevice *dev)
 
 static int soft_spi_probe(struct udevice *dev)
 {
-	struct spi_slave *slave = dev_get_parent_priv(dev);
 	struct soft_spi_platdata *plat = dev->platdata;
-	int cs_flags, clk_flags;
 	int ret;
 
-	cs_flags = (slave->mode & SPI_CS_HIGH) ? 0 : GPIOD_ACTIVE_LOW;
-	clk_flags = (slave->mode & SPI_CPOL) ? GPIOD_ACTIVE_LOW : 0;
-
 	if (gpio_request_by_name(dev, "cs-gpios", 0, &plat->cs,
-				 GPIOD_IS_OUT | cs_flags) ||
+				 GPIOD_IS_OUT) ||
 	    gpio_request_by_name(dev, "gpio-sck", 0, &plat->sclk,
-				 GPIOD_IS_OUT | clk_flags))
+				 GPIOD_IS_OUT))
 		return -EINVAL;
 
 	ret = gpio_request_by_name(dev, "gpio-mosi", 0, &plat->mosi,
Signature · 1 line
- Daniel
Signature · 1 line
/Horatiu