lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 213/913] spi: pxa2xx-pci: Balance reference count for PCI DMA device
    Date
    From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>

    [ Upstream commit 609d7ffdc42199a0ec949db057e3b4be6745d6c5 ]

    The pci_get_slot() increases its reference count, the caller
    must decrement the reference count by calling pci_dev_put().

    Fixes: 743485ea3bee ("spi: pxa2xx-pci: Do a specific setup in a separate function")
    Fixes: 25014521603f ("spi: pxa2xx-pci: Enable DMA for Intel Merrifield")
    Reported-by: Wang Qing <wangqing@vivo.com>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Link: https://lore.kernel.org/r/20220223191637.31147-1-andriy.shevchenko@linux.intel.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi-pxa2xx-pci.c | 17 ++++++++++++++++-
    1 file changed, 16 insertions(+), 1 deletion(-)

    diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
    index 2e134eb4bd2c..6502fda6243e 100644
    --- a/drivers/spi/spi-pxa2xx-pci.c
    +++ b/drivers/spi/spi-pxa2xx-pci.c
    @@ -76,14 +76,23 @@ static bool lpss_dma_filter(struct dma_chan *chan, void *param)
    return true;
    }

    +static void lpss_dma_put_device(void *dma_dev)
    +{
    + pci_dev_put(dma_dev);
    +}
    +
    static int lpss_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
    {
    struct pci_dev *dma_dev;
    + int ret;

    c->num_chipselect = 1;
    c->max_clk_rate = 50000000;

    dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
    + ret = devm_add_action_or_reset(&dev->dev, lpss_dma_put_device, dma_dev);
    + if (ret)
    + return ret;

    if (c->tx_param) {
    struct dw_dma_slave *slave = c->tx_param;
    @@ -107,8 +116,9 @@ static int lpss_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)

    static int mrfld_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
    {
    - struct pci_dev *dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(21, 0));
    struct dw_dma_slave *tx, *rx;
    + struct pci_dev *dma_dev;
    + int ret;

    switch (PCI_FUNC(dev->devfn)) {
    case 0:
    @@ -133,6 +143,11 @@ static int mrfld_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
    return -ENODEV;
    }

    + dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(21, 0));
    + ret = devm_add_action_or_reset(&dev->dev, lpss_dma_put_device, dma_dev);
    + if (ret)
    + return ret;
    +
    tx = c->tx_param;
    tx->dma_dev = &dma_dev->dev;

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-05 22:01    [W:2.312 / U:0.464 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site