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>
This commit is contained in:
parent
f10d52087c
commit
07f1eb718d
@ -604,6 +604,21 @@ static int spi_geni_prepare_message(struct spi_controller *spi,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spi_geni_release_dma_chan(void *data)
|
||||||
|
{
|
||||||
|
struct spi_geni_master *mas = data;
|
||||||
|
|
||||||
|
if (mas->rx) {
|
||||||
|
dma_release_channel(mas->rx);
|
||||||
|
mas->rx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mas->tx) {
|
||||||
|
dma_release_channel(mas->tx);
|
||||||
|
mas->tx = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
|
static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -622,6 +637,12 @@ static int spi_geni_grab_gpi_chan(struct spi_geni_master *mas)
|
|||||||
goto err_rx;
|
goto err_rx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = devm_add_action_or_reset(mas->dev, spi_geni_release_dma_chan, mas);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(mas->dev, "Unable to add action.\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_rx:
|
err_rx:
|
||||||
@ -632,19 +653,6 @@ err_tx:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void spi_geni_release_dma_chan(struct spi_geni_master *mas)
|
|
||||||
{
|
|
||||||
if (mas->rx) {
|
|
||||||
dma_release_channel(mas->rx);
|
|
||||||
mas->rx = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mas->tx) {
|
|
||||||
dma_release_channel(mas->tx);
|
|
||||||
mas->tx = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int spi_geni_init(struct spi_geni_master *mas)
|
static int spi_geni_init(struct spi_geni_master *mas)
|
||||||
{
|
{
|
||||||
struct spi_controller *spi = dev_get_drvdata(mas->dev);
|
struct spi_controller *spi = dev_get_drvdata(mas->dev);
|
||||||
@ -1146,33 +1154,11 @@ static int spi_geni_probe(struct platform_device *pdev)
|
|||||||
if (mas->cur_xfer_mode == GENI_GPI_DMA)
|
if (mas->cur_xfer_mode == GENI_GPI_DMA)
|
||||||
spi->flags = SPI_CONTROLLER_MUST_TX;
|
spi->flags = SPI_CONTROLLER_MUST_TX;
|
||||||
|
|
||||||
ret = request_irq(mas->irq, geni_spi_isr, 0, dev_name(dev), spi);
|
ret = devm_request_irq(dev, mas->irq, geni_spi_isr, 0, dev_name(dev), spi);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto spi_geni_release_dma;
|
|
||||||
|
|
||||||
ret = spi_register_controller(spi);
|
|
||||||
if (ret)
|
|
||||||
goto spi_geni_probe_free_irq;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
spi_geni_probe_free_irq:
|
|
||||||
free_irq(mas->irq, spi);
|
|
||||||
spi_geni_release_dma:
|
|
||||||
spi_geni_release_dma_chan(mas);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
static void spi_geni_remove(struct platform_device *pdev)
|
return devm_spi_register_controller(dev, spi);
|
||||||
{
|
|
||||||
struct spi_controller *spi = platform_get_drvdata(pdev);
|
|
||||||
struct spi_geni_master *mas = spi_controller_get_devdata(spi);
|
|
||||||
|
|
||||||
/* Unregister _before_ disabling pm_runtime() so we stop transfers */
|
|
||||||
spi_unregister_controller(spi);
|
|
||||||
|
|
||||||
free_irq(mas->irq, spi);
|
|
||||||
|
|
||||||
spi_geni_release_dma_chan(mas);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
|
static int __maybe_unused spi_geni_runtime_suspend(struct device *dev)
|
||||||
@ -1254,7 +1240,6 @@ MODULE_DEVICE_TABLE(of, spi_geni_dt_match);
|
|||||||
|
|
||||||
static struct platform_driver spi_geni_driver = {
|
static struct platform_driver spi_geni_driver = {
|
||||||
.probe = spi_geni_probe,
|
.probe = spi_geni_probe,
|
||||||
.remove_new = spi_geni_remove,
|
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "geni_spi",
|
.name = "geni_spi",
|
||||||
.pm = &spi_geni_pm_ops,
|
.pm = &spi_geni_pm_ops,
|
||||||
|
Loading…
Reference in New Issue
Block a user