lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.12 119/700] spi: Make of_register_spi_device also set the fwnode
    Date
    From: Charles Keepax <ckeepax@opensource.cirrus.com>

    [ Upstream commit 0e793ba77c18382f08e440260fe72bc6fce2a3cb ]

    Currently, the SPI core doesn't set the struct device fwnode pointer
    when it creates a new SPI device. This means when the device is
    registered the fwnode is NULL and the check in device_add which sets
    the fwnode->dev pointer is skipped. This wasn't previously an issue,
    however these two patches:

    commit 4731210c09f5 ("gpiolib: Bind gpio_device to a driver to enable
    fw_devlink=on by default")
    commit ced2af419528 ("gpiolib: Don't probe gpio_device if it's not the
    primary device")

    Added some code to the GPIO core which relies on using that
    fwnode->dev pointer to determine if a driver is bound to the fwnode
    and if not bind a stub GPIO driver. This means the GPIO providers
    behind SPI will get both the expected driver and this stub driver
    causing the stub driver to fail if it attempts to request any pin
    configuration. For example on my system:

    madera-pinctrl madera-pinctrl: pin gpio5 already requested by madera-pinctrl; cannot claim for gpiochip3
    madera-pinctrl madera-pinctrl: pin-4 (gpiochip3) status -22
    madera-pinctrl madera-pinctrl: could not request pin 4 (gpio5) from group aif1 on device madera-pinctrl
    gpio_stub_drv gpiochip3: Error applying setting, reverse things back
    gpio_stub_drv: probe of gpiochip3 failed with error -22

    The firmware node on the device created by the GPIO framework is set
    through the of_node pointer hence things generally actually work,
    however that fwnode->dev is never set, as the check was skipped at
    device_add time. This fix appears to match how the I2C subsystem
    handles the same situation.

    Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
    Link: https://lore.kernel.org/r/20210421101402.8468-1-ckeepax@opensource.cirrus.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
    index e067c54e87dd..789354ee6a11 100644
    --- a/drivers/spi/spi.c
    +++ b/drivers/spi/spi.c
    @@ -2066,6 +2066,7 @@ of_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)
    /* Store a pointer to the node in the device structure */
    of_node_get(nc);
    spi->dev.of_node = nc;
    + spi->dev.fwnode = of_fwnode_handle(nc);

    /* Register the new device */
    rc = spi_add_device(spi);
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 09:25    [W:4.020 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site