| From 1296560d9a860bc9aabcb4f3630036f81fa328ef Mon Sep 17 00:00:00 2001 |
| From: Andrey Smirnov <andrew.smirnov@gmail.com> |
| Date: Tue, 2 Apr 2019 21:01:28 -0700 |
| Subject: spi: Don't call spi_get_gpio_descs() before device name is set |
| |
| [ Upstream commit 0a919ae49223d32ac0e8be3494547fcd1e4aa0aa ] |
| |
| Move code calling spi_get_gpio_descs() to happen after ctlr->dev's |
| name is set in order to have proper GPIO consumer names. |
| |
| Before: |
| |
| cat /sys/kernel/debug/gpio |
| gpiochip0: GPIOs 0-31, parent: platform/40049000.gpio, vf610-gpio: |
| gpio-6 ( |regulator-usb0-vbus ) out lo |
| |
| gpiochip1: GPIOs 32-63, parent: platform/4004a000.gpio, vf610-gpio: |
| gpio-36 ( |scl ) in hi |
| gpio-37 ( |sda ) in hi |
| gpio-40 ( |(null) CS1 ) out lo |
| gpio-41 ( |(null) CS0 ) out lo ACTIVE LOW |
| gpio-42 ( |miso ) in hi |
| gpio-43 ( |mosi ) in lo |
| gpio-44 ( |sck ) out lo |
| |
| After: |
| |
| cat /sys/kernel/debug/gpio |
| gpiochip0: GPIOs 0-31, parent: platform/40049000.gpio, vf610-gpio: |
| gpio-6 ( |regulator-usb0-vbus ) out lo |
| |
| gpiochip1: GPIOs 32-63, parent: platform/4004a000.gpio, vf610-gpio: |
| gpio-36 ( |scl ) in hi |
| gpio-37 ( |sda ) in hi |
| gpio-40 ( |spi0 CS1 ) out lo |
| gpio-41 ( |spi0 CS0 ) out lo ACTIVE LOW |
| gpio-42 ( |miso ) in hi |
| gpio-43 ( |mosi ) in lo |
| gpio-44 ( |sck ) out lo |
| |
| Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> |
| Cc: Mark Brown <broonie@kernel.org> |
| Cc: Chris Healy <cphealy@gmail.com> |
| Cc: linux-spi@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/spi/spi.c | 37 +++++++++++++++++++------------------ |
| 1 file changed, 19 insertions(+), 18 deletions(-) |
| |
| diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
| index 93986f879b09e..d17f68775a4bb 100644 |
| --- a/drivers/spi/spi.c |
| +++ b/drivers/spi/spi.c |
| @@ -2275,24 +2275,6 @@ int spi_register_controller(struct spi_controller *ctlr) |
| if (status) |
| return status; |
| |
| - if (!spi_controller_is_slave(ctlr)) { |
| - if (ctlr->use_gpio_descriptors) { |
| - status = spi_get_gpio_descs(ctlr); |
| - if (status) |
| - return status; |
| - /* |
| - * A controller using GPIO descriptors always |
| - * supports SPI_CS_HIGH if need be. |
| - */ |
| - ctlr->mode_bits |= SPI_CS_HIGH; |
| - } else { |
| - /* Legacy code path for GPIOs from DT */ |
| - status = of_spi_register_master(ctlr); |
| - if (status) |
| - return status; |
| - } |
| - } |
| - |
| /* even if it's just one always-selected device, there must |
| * be at least one chipselect |
| */ |
| @@ -2349,6 +2331,25 @@ int spi_register_controller(struct spi_controller *ctlr) |
| * registration fails if the bus ID is in use. |
| */ |
| dev_set_name(&ctlr->dev, "spi%u", ctlr->bus_num); |
| + |
| + if (!spi_controller_is_slave(ctlr)) { |
| + if (ctlr->use_gpio_descriptors) { |
| + status = spi_get_gpio_descs(ctlr); |
| + if (status) |
| + return status; |
| + /* |
| + * A controller using GPIO descriptors always |
| + * supports SPI_CS_HIGH if need be. |
| + */ |
| + ctlr->mode_bits |= SPI_CS_HIGH; |
| + } else { |
| + /* Legacy code path for GPIOs from DT */ |
| + status = of_spi_register_master(ctlr); |
| + if (status) |
| + return status; |
| + } |
| + } |
| + |
| status = device_add(&ctlr->dev); |
| if (status < 0) { |
| /* free bus id */ |
| -- |
| 2.20.1 |
| |