As we get a child node in the of case, we should also clean up the references to this, add code for this. Suggested-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx> Signed-off-by: Charles Keepax <ckeepax@xxxxxxxxxxxxxxxxxxxxx> --- drivers/spi/spi-cs42l43.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/spi/spi-cs42l43.c b/drivers/spi/spi-cs42l43.c index b24190526ce9..1765d752e341 100644 --- a/drivers/spi/spi-cs42l43.c +++ b/drivers/spi/spi-cs42l43.c @@ -218,6 +218,7 @@ static int cs42l43_spi_probe(struct platform_device *pdev) return -ENOMEM; spi_controller_set_devdata(priv->ctlr, priv); + platform_set_drvdata(pdev, priv); priv->dev = &pdev->dev; priv->regmap = cs42l43->regmap; @@ -228,12 +229,6 @@ static int cs42l43_spi_probe(struct platform_device *pdev) priv->ctlr->transfer_one = cs42l43_transfer_one; priv->ctlr->set_cs = cs42l43_set_cs; priv->ctlr->max_transfer_size = cs42l43_spi_max_length; - - if (is_of_node(fwnode)) - fwnode = fwnode_get_named_child_node(fwnode, "spi"); - - device_set_node(&priv->ctlr->dev, fwnode); - priv->ctlr->mode_bits = SPI_3WIRE | SPI_MODE_X_MASK; priv->ctlr->flags = SPI_CONTROLLER_HALF_DUPLEX; priv->ctlr->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) | @@ -257,14 +252,34 @@ static int cs42l43_spi_probe(struct platform_device *pdev) regmap_write(priv->regmap, CS42L43_SPI_CONFIG3, 0); regmap_write(priv->regmap, CS42L43_SPI_CONFIG4, CS42L43_SPI_STALL_ENA_MASK); + if (is_of_node(fwnode)) + fwnode = fwnode_get_named_child_node(fwnode, "spi"); + + device_set_node(&priv->ctlr->dev, fwnode); + ret = devm_spi_register_controller(priv->dev, priv->ctlr); if (ret) { dev_err(priv->dev, "Failed to register SPI controller: %d\n", ret); + goto of_node_err; } + return 0; + +of_node_err: + if (is_of_node(fwnode)) + fwnode_handle_put(fwnode); + return ret; } +static void cs42l43_spi_remove(struct platform_device *pdev) +{ + struct cs42l43_spi *priv = dev_get_drvdata(&pdev->dev); + + if (is_of_node(priv->ctlr->dev.fwnode)) + fwnode_handle_put(priv->ctlr->dev.fwnode); +} + static const struct platform_device_id cs42l43_spi_id_table[] = { { "cs42l43-spi", }, {} @@ -276,6 +291,7 @@ static struct platform_driver cs42l43_spi_driver = { .name = "cs42l43-spi", }, .probe = cs42l43_spi_probe, + .remove_new = cs42l43_spi_remove, .id_table = cs42l43_spi_id_table, }; module_platform_driver(cs42l43_spi_driver); -- 2.30.2