[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251201134229.600817-5-cosmin-gabriel.tanislav.xa@renesas.com>
Date: Mon, 1 Dec 2025 15:42:20 +0200
From: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@...esas.com>
To: Fabrizio Castro <fabrizio.castro.jz@...esas.com>,
Mark Brown <broonie@...nel.org>,
Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk+dt@...nel.org>,
Conor Dooley <conor+dt@...nel.org>,
Geert Uytterhoeven <geert+renesas@...der.be>,
Magnus Damm <magnus.damm@...il.com>,
Philipp Zabel <p.zabel@...gutronix.de>
Cc: linux-spi@...r.kernel.org,
linux-renesas-soc@...r.kernel.org,
devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org,
Cosmin Tanislav <cosmin-gabriel.tanislav.xa@...esas.com>
Subject: [PATCH 04/13] spi: rzv2h-rspi: use device-managed APIs
Non-device-managed APIs were initially used here to avoid the buggy
interaction between PM domains and device-managed actions.
Commit f99508074e78 ("PM: domains: Detach on device_unbind_cleanup()")
fixed the interaction between PM domains and device-managed actions.
Simplify the code by using device-managed actions to unregister the SPI
controller and to assert and release the resets.
Signed-off-by: Cosmin Tanislav <cosmin-gabriel.tanislav.xa@...esas.com>
---
drivers/spi/spi-rzv2h-rspi.c | 58 ++++++++++++------------------------
1 file changed, 19 insertions(+), 39 deletions(-)
diff --git a/drivers/spi/spi-rzv2h-rspi.c b/drivers/spi/spi-rzv2h-rspi.c
index 02424d4e722a..6163ada3ccbb 100644
--- a/drivers/spi/spi-rzv2h-rspi.c
+++ b/drivers/spi/spi-rzv2h-rspi.c
@@ -93,7 +93,6 @@ struct rzv2h_rspi_info {
};
struct rzv2h_rspi_priv {
- struct reset_control_bulk_data resets[RSPI_RESET_NUM];
struct spi_controller *controller;
const struct rzv2h_rspi_info *info;
void __iomem *base;
@@ -533,6 +532,7 @@ static int rzv2h_rspi_probe(struct platform_device *pdev)
struct spi_controller *controller;
struct device *dev = &pdev->dev;
struct rzv2h_rspi_priv *rspi;
+ struct reset_control *reset;
struct clk_bulk_data *clks;
int irq_rx, ret, i;
long tclk_rate;
@@ -568,28 +568,29 @@ static int rzv2h_rspi_probe(struct platform_device *pdev)
if (!rspi->tclk)
return dev_err_probe(dev, -EINVAL, "Failed to get tclk\n");
- rspi->resets[0].id = "presetn";
- rspi->resets[1].id = "tresetn";
- ret = devm_reset_control_bulk_get_optional_exclusive(dev, RSPI_RESET_NUM,
- rspi->resets);
- if (ret)
- return dev_err_probe(dev, ret, "cannot get resets\n");
+ reset = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev,
+ "presetn");
+ if (IS_ERR(reset))
+ return dev_err_probe(&pdev->dev, PTR_ERR(reset),
+ "cannot get presetn reset\n");
+
+ reset = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev,
+ "tresetn");
+ if (IS_ERR(reset))
+ return dev_err_probe(&pdev->dev, PTR_ERR(reset),
+ "cannot get tresetn reset\n");
irq_rx = platform_get_irq_byname(pdev, "rx");
if (irq_rx < 0)
return dev_err_probe(dev, irq_rx, "cannot get IRQ 'rx'\n");
- ret = reset_control_bulk_deassert(RSPI_RESET_NUM, rspi->resets);
- if (ret)
- return dev_err_probe(dev, ret, "failed to deassert resets\n");
-
init_waitqueue_head(&rspi->wait);
ret = devm_request_irq(dev, irq_rx, rzv2h_rx_irq_handler, 0,
dev_name(dev), rspi);
if (ret) {
dev_err(dev, "cannot request `rx` IRQ\n");
- goto quit_resets;
+ return ret;
}
controller->mode_bits = SPI_CPHA | SPI_CPOL | SPI_CS_HIGH |
@@ -601,20 +602,16 @@ static int rzv2h_rspi_probe(struct platform_device *pdev)
controller->transfer_one = rzv2h_rspi_transfer_one;
tclk_rate = clk_round_rate(rspi->tclk, 0);
- if (tclk_rate < 0) {
- ret = tclk_rate;
- goto quit_resets;
- }
+ if (tclk_rate < 0)
+ return tclk_rate;
controller->min_speed_hz = rzv2h_rspi_calc_bitrate(tclk_rate,
RSPI_SPBR_SPR_MAX,
RSPI_SPCMD_BRDV_MAX);
tclk_rate = clk_round_rate(rspi->tclk, ULONG_MAX);
- if (tclk_rate < 0) {
- ret = tclk_rate;
- goto quit_resets;
- }
+ if (tclk_rate < 0)
+ return tclk_rate;
controller->max_speed_hz = rzv2h_rspi_calc_bitrate(tclk_rate,
RSPI_SPBR_SPR_MIN,
@@ -622,29 +619,13 @@ static int rzv2h_rspi_probe(struct platform_device *pdev)
device_set_node(&controller->dev, dev_fwnode(dev));
- ret = spi_register_controller(controller);
- if (ret) {
+ ret = devm_spi_register_controller(dev, controller);
+ if (ret)
dev_err(dev, "register controller failed\n");
- goto quit_resets;
- }
-
- return 0;
-
-quit_resets:
- reset_control_bulk_assert(RSPI_RESET_NUM, rspi->resets);
return ret;
}
-static void rzv2h_rspi_remove(struct platform_device *pdev)
-{
- struct rzv2h_rspi_priv *rspi = platform_get_drvdata(pdev);
-
- spi_unregister_controller(rspi->controller);
-
- reset_control_bulk_assert(RSPI_RESET_NUM, rspi->resets);
-}
-
static const struct rzv2h_rspi_info rzv2h_info = {
.find_tclk_rate = rzv2h_rspi_find_rate_fixed,
.tclk_name = "tclk",
@@ -669,7 +650,6 @@ MODULE_DEVICE_TABLE(of, rzv2h_rspi_match);
static struct platform_driver rzv2h_rspi_drv = {
.probe = rzv2h_rspi_probe,
- .remove = rzv2h_rspi_remove,
.driver = {
.name = "rzv2h_rspi",
.of_match_table = rzv2h_rspi_match,
--
2.52.0
Powered by blists - more mailing lists