Commit cfb4bbd8 authored by Torsten Fleischer's avatar Torsten Fleischer Committed by Mark Brown

spi: spi-gpio: Fix compiler warning when building for 64 bit systems

The assignment of SPI_GPIO_NO_CHIPSELECT to cs_gpios[0] causes the following
compiler warning, when building for 64 bit systems:
"warning: overflow in implicit constant conversion [-Woverflow]".

This is because the SPI_GPIO_NO_CHIPSELECT flag is a '-1' type casted to
unsigned long and cs_gpios is of the type int.

Furthermore the chip select's GPIO number is locally stored as unsigned int
and compared with SPI_GPIO_NO_CHIPSELECT. Thus the result of the comparison
is always false, if unsigned long and unsigned int have a different size.

As part of the fix this patch adds a check for the device tree's cs-gpios
property.
Reported-by: default avatarkbuild test robot <fengguang.wu@intel.com>
Signed-off-by: default avatarTorsten Fleischer <torfl6749@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d1d81802
...@@ -48,7 +48,7 @@ struct spi_gpio { ...@@ -48,7 +48,7 @@ struct spi_gpio {
struct spi_bitbang bitbang; struct spi_bitbang bitbang;
struct spi_gpio_platform_data pdata; struct spi_gpio_platform_data pdata;
struct platform_device *pdev; struct platform_device *pdev;
int cs_gpios[0]; unsigned long cs_gpios[0];
}; };
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
...@@ -220,7 +220,7 @@ static u32 spi_gpio_spec_txrx_word_mode3(struct spi_device *spi, ...@@ -220,7 +220,7 @@ static u32 spi_gpio_spec_txrx_word_mode3(struct spi_device *spi,
static void spi_gpio_chipselect(struct spi_device *spi, int is_active) static void spi_gpio_chipselect(struct spi_device *spi, int is_active)
{ {
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
unsigned int cs = spi_gpio->cs_gpios[spi->chip_select]; unsigned long cs = spi_gpio->cs_gpios[spi->chip_select];
/* set initial clock polarity */ /* set initial clock polarity */
if (is_active) if (is_active)
...@@ -234,7 +234,7 @@ static void spi_gpio_chipselect(struct spi_device *spi, int is_active) ...@@ -234,7 +234,7 @@ static void spi_gpio_chipselect(struct spi_device *spi, int is_active)
static int spi_gpio_setup(struct spi_device *spi) static int spi_gpio_setup(struct spi_device *spi)
{ {
unsigned int cs; unsigned long cs;
int status = 0; int status = 0;
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
struct device_node *np = spi->master->dev.of_node; struct device_node *np = spi->master->dev.of_node;
...@@ -249,7 +249,7 @@ static int spi_gpio_setup(struct spi_device *spi) ...@@ -249,7 +249,7 @@ static int spi_gpio_setup(struct spi_device *spi)
/* /*
* ... otherwise, take it from spi->controller_data * ... otherwise, take it from spi->controller_data
*/ */
cs = (unsigned int)(uintptr_t) spi->controller_data; cs = (uintptr_t) spi->controller_data;
} }
if (!spi->controller_state) { if (!spi->controller_state) {
...@@ -277,7 +277,7 @@ static int spi_gpio_setup(struct spi_device *spi) ...@@ -277,7 +277,7 @@ static int spi_gpio_setup(struct spi_device *spi)
static void spi_gpio_cleanup(struct spi_device *spi) static void spi_gpio_cleanup(struct spi_device *spi)
{ {
struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi); struct spi_gpio *spi_gpio = spi_to_spi_gpio(spi);
unsigned int cs = spi_gpio->cs_gpios[spi->chip_select]; unsigned long cs = spi_gpio->cs_gpios[spi->chip_select];
if (cs != SPI_GPIO_NO_CHIPSELECT) if (cs != SPI_GPIO_NO_CHIPSELECT)
gpio_free(cs); gpio_free(cs);
...@@ -437,7 +437,7 @@ static int spi_gpio_probe(struct platform_device *pdev) ...@@ -437,7 +437,7 @@ static int spi_gpio_probe(struct platform_device *pdev)
return status; return status;
master = spi_alloc_master(&pdev->dev, sizeof(*spi_gpio) + master = spi_alloc_master(&pdev->dev, sizeof(*spi_gpio) +
(sizeof(int) * num_devices)); (sizeof(unsigned long) * num_devices));
if (!master) { if (!master) {
status = -ENOMEM; status = -ENOMEM;
goto gpio_free; goto gpio_free;
...@@ -470,9 +470,15 @@ static int spi_gpio_probe(struct platform_device *pdev) ...@@ -470,9 +470,15 @@ static int spi_gpio_probe(struct platform_device *pdev)
if (!SPI_N_CHIPSEL) if (!SPI_N_CHIPSEL)
spi_gpio->cs_gpios[0] = SPI_GPIO_NO_CHIPSELECT; spi_gpio->cs_gpios[0] = SPI_GPIO_NO_CHIPSELECT;
else else
for (i = 0; i < SPI_N_CHIPSEL; i++) for (i = 0; i < SPI_N_CHIPSEL; i++) {
spi_gpio->cs_gpios[i] = status = of_get_named_gpio(np, "cs-gpios", i);
of_get_named_gpio(np, "cs-gpios", i); if (status < 0) {
dev_err(&pdev->dev,
"invalid cs-gpios property\n");
goto gpio_free;
}
spi_gpio->cs_gpios[i] = status;
}
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment