spi: soft_spi: Fix for soft_spi
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
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
PATCH v2 1/1 spi: soft_spi: Fix null ptr when probing soft_spi.
In reply to Horatiu VulturWhen 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
@@ -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
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_spithe result ofdev_get_parent_priv(dev)in probe function is null ptr because the spi is on the ahb bus which hasper_child_auto_alloc_sizeset to 0. Therefore it would generate an Ooops messages when accessingspi_slavestructure.
Quoted 7 lines
The fix consist of updating the
soft_spi_platdataflags inside the .set_mode.Signed-off-by Horatiu Vultur <[email protected]>--- 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@@ -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
-0struct 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
-7return 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
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_spithe result ofdev_get_parent_priv(dev)in probe function is null ptr because the spi is on the ahb bus which hasper_child_auto_alloc_sizeset to 0. Therefore it would generate an Ooops messages when accessingspi_slavestructure.The fix consist of updating the
soft_spi_platdataflags inside the .set_mode.
Quoted 6 lines
Quoted 4 lines
Signed-off-by Horatiu Vultur <[email protected]>--- 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@@ -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
-7return 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