Em Mon, 16 Nov 2020 09:23:13 +0100 Lukas Wunner <lukas@xxxxxxxxx> escreveu: > If the call to spi_register_master() fails on probe of the NetUP > Universal DVB driver, the spi_master struct is erroneously not freed. > > Likewise, if spi_new_device() fails, the spi_controller struct is > not unregistered. Plug the leaks. > > While at it, fix an ordering issue in netup_spi_release() wherein > spi_unregister_master() is called after fiddling with the IRQ control > register. The correct order is to call spi_unregister_master() *before* > this teardown step because bus accesses may still be ongoing until that > function returns. > > Fixes: 52b1eaf4c59a ("[media] netup_unidvb: NetUP Universal DVB-S/S2/T/T2/C PCI-E card driver") > Signed-off-by: Lukas Wunner <lukas@xxxxxxxxx> > Cc: <stable@xxxxxxxxxxxxxxx> # v4.3+: 5e844cc37a5c: spi: Introduce device-managed SPI controller allocation > Cc: <stable@xxxxxxxxxxxxxxx> # v4.3+ > Cc: Kozlov Sergey <serjk@xxxxxxxx> > --- > @Mauro Carvalho Chehab: > This patch needs to go in through the spi tree because it depends on > commit 5e844cc37a5c, which is on the spi/for-5.10 branch. > Please ack (barring any objections). Thanks! Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> I'm OK on having this merged via SPI mailing list. > > drivers/media/pci/netup_unidvb/netup_unidvb_spi.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c b/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c > index d4f12c250f91..526042d8afae 100644 > --- a/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c > +++ b/drivers/media/pci/netup_unidvb/netup_unidvb_spi.c > @@ -175,7 +175,7 @@ int netup_spi_init(struct netup_unidvb_dev *ndev) > struct spi_master *master; > struct netup_spi *nspi; > > - master = spi_alloc_master(&ndev->pci_dev->dev, > + master = devm_spi_alloc_master(&ndev->pci_dev->dev, > sizeof(struct netup_spi)); > if (!master) { > dev_err(&ndev->pci_dev->dev, > @@ -208,6 +208,7 @@ int netup_spi_init(struct netup_unidvb_dev *ndev) > ndev->pci_slot, > ndev->pci_func); > if (!spi_new_device(master, &netup_spi_board)) { > + spi_unregister_master(master); > ndev->spi = NULL; > dev_err(&ndev->pci_dev->dev, > "%s(): unable to create SPI device\n", __func__); > @@ -226,13 +227,13 @@ void netup_spi_release(struct netup_unidvb_dev *ndev) > if (!spi) > return; > > + spi_unregister_master(spi->master); > spin_lock_irqsave(&spi->lock, flags); > reg = readw(&spi->regs->control_stat); > writew(reg | NETUP_SPI_CTRL_IRQ, &spi->regs->control_stat); > reg = readw(&spi->regs->control_stat); > writew(reg & ~NETUP_SPI_CTRL_IMASK, &spi->regs->control_stat); > spin_unlock_irqrestore(&spi->lock, flags); > - spi_unregister_master(spi->master); > ndev->spi = NULL; > } > Thanks, Mauro