Skip to content

Commit 07f1eb7

Browse files
Jinjie Ruanbroonie
authored andcommitted
spi: geni-qcom: Use devm functions to simplify code
Use devm_pm_runtime_enable(), devm_request_irq() and devm_spi_register_controller() to simplify code. And also register a callback spi_geni_release_dma_chan() with devm_add_action_or_reset(), to release dma channel in both error and device detach path, which can make sure the release sequence is consistent with the original one. 1. Unregister spi controller. 2. Free the IRQ. 3. Free DMA chans 4. Disable runtime PM. So the remove function can also be removed. Reviewed-by: Douglas Anderson <dianders@chromium.org> Suggested-by: Doug Anderson <dianders@chromium.org> Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com> Link: https://patch.msgid.link/20240912091701.3720857-1-ruanjinjie@huawei.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent f10d520 commit 07f1eb7

File tree

1 file changed

+24
-39
lines changed

1 file changed

+24
-39
lines changed

drivers/spi/spi-geni-qcom.c

Lines changed: 24 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,21 @@ static int spi_geni_prepare_message(struct spi_controller *spi,
604604
return -EINVAL;
605605
}
606606

607+
static void spi_geni_release_dma_chan(void *data)
608+
{
609+
struct spi_geni_master *mas = data;
610+
611+
if (mas->rx) {
612+
dma_release_channel(mas->rx);
613+
mas->rx = NULL;
614+
}
615+
616+
if (mas->tx) {
617+
dma_release_channel(mas->tx);
618+
mas->tx = NULL;
619+
}
620+
}
621+
607622
static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
608623
{
609624
int ret;
@@ -622,6 +637,12 @@ static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
622637
goto err_rx;
623638
}
624639

640+
ret = devm_add_action_or_reset(mas->dev, spi_geni_release_dma_chan, mas);
641+
if (ret) {
642+
dev_err(mas->dev, "Unable to add action.\n");
643+
return ret;
644+
}
645+
625646
return 0;
626647

627648
err_rx:
@@ -632,19 +653,6 @@ static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
632653
return ret;
633654
}
634655

635-
static void spi_geni_release_dma_chan(struct spi_geni_master *mas)
636-
{
637-
if (mas->rx) {
638-
dma_release_channel(mas->rx);
639-
mas->rx = NULL;
640-
}
641-
642-
if (mas->tx) {
643-
dma_release_channel(mas->tx);
644-
mas->tx = NULL;
645-
}
646-
}
647-
648656
static int spi_geni_init(struct spi_geni_master *mas)
649657
{
650658
struct spi_controller *spi = dev_get_drvdata(mas->dev);
@@ -1146,33 +1154,11 @@ static int spi_geni_probe(struct platform_device *pdev)
11461154
if (mas->cur_xfer_mode == GENI_GPI_DMA)
11471155
spi->flags = SPI_CONTROLLER_MUST_TX;
11481156

1149-
ret = request_irq(mas->irq, geni_spi_isr, 0, dev_name(dev), spi);
1150-
if (ret)
1151-
goto spi_geni_release_dma;
1152-
1153-
ret = spi_register_controller(spi);
1157+
ret = devm_request_irq(dev, mas->irq, geni_spi_isr, 0, dev_name(dev), spi);
11541158
if (ret)
1155-
goto spi_geni_probe_free_irq;
1156-
1157-
return 0;
1158-
spi_geni_probe_free_irq:
1159-
free_irq(mas->irq, spi);
1160-
spi_geni_release_dma:
1161-
spi_geni_release_dma_chan(mas);
1162-
return ret;
1163-
}
1164-
1165-
static void spi_geni_remove(struct platform_device *pdev)
1166-
{
1167-
struct spi_controller *spi = platform_get_drvdata(pdev);
1168-
struct spi_geni_master *mas = spi_controller_get_devdata(spi);
1169-
1170-
/* Unregister _before_ disabling pm_runtime() so we stop transfers */
1171-
spi_unregister_controller(spi);
1172-
1173-
free_irq(mas->irq, spi);
1159+
return ret;
11741160

1175-
spi_geni_release_dma_chan(mas);
1161+
return devm_spi_register_controller(dev, spi);
11761162
}
11771163

11781164
static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
@@ -1254,7 +1240,6 @@ MODULE_DEVICE_TABLE(of, spi_geni_dt_match);
12541240

12551241
static struct platform_driver spi_geni_driver = {
12561242
.probe = spi_geni_probe,
1257-
.remove_new = spi_geni_remove,
12581243
.driver = {
12591244
.name = "geni_spi",
12601245
.pm = &spi_geni_pm_ops,

0 commit comments

Comments
 (0)