Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: bitbang: Let spi_bitbang_start() take a reference to master

Many drivers that use bitbang library have a leak on probe error paths.
This is because once a spi_master_get() call succeeds, we need an additional
spi_master_put() call to free the memory.

Fix this issue by moving the code taking a reference to master to
spi_bitbang_start(), so spi_bitbang_start() will take a reference to master on
success. With this change, the caller is responsible for calling
spi_bitbang_stop() to decrement the reference and spi_master_put() as
counterpart of spi_alloc_master() to prevent a memory leak.

So now we have below patten for drivers using bitbang library:

probe:
spi_alloc_master -> Init reference count to 1
spi_bitbang_start -> Increment reference count
remove:
spi_bitbang_stop -> Decrement reference count
spi_master_put -> Decrement reference count (reference count reaches 0)

Fixup all users accordingly.

Signed-off-by: Axel Lin <axel.lin@ingics.com>
Suggested-by: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
Acked-by: Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
Signed-off-by: Mark Brown <broonie@linaro.org>

authored by

Axel Lin and committed by
Mark Brown
702a4879 d0e639c9

+33 -26
+1 -1
drivers/spi/spi-altera.c
··· 219 219 platform_set_drvdata(pdev, hw); 220 220 221 221 /* setup the state for the bitbang driver */ 222 - hw->bitbang.master = spi_master_get(master); 222 + hw->bitbang.master = master; 223 223 if (!hw->bitbang.master) 224 224 return err; 225 225 hw->bitbang.chipselect = altera_spi_chipsel;
+1 -1
drivers/spi/spi-ath79.c
··· 231 231 master->num_chipselect = pdata->num_chipselect; 232 232 } 233 233 234 - sp->bitbang.master = spi_master_get(master); 234 + sp->bitbang.master = master; 235 235 sp->bitbang.chipselect = ath79_spi_chipselect; 236 236 sp->bitbang.txrx_word[SPI_MODE_0] = ath79_spi_txrx_mode0; 237 237 sp->bitbang.setup_transfer = spi_bitbang_setup_transfer;
+1 -1
drivers/spi/spi-au1550.c
··· 775 775 776 776 hw = spi_master_get_devdata(master); 777 777 778 - hw->master = spi_master_get(master); 778 + hw->master = master; 779 779 hw->pdata = dev_get_platdata(&pdev->dev); 780 780 hw->dev = &pdev->dev; 781 781
+11 -1
drivers/spi/spi-bitbang.c
··· 414 414 * This routine registers the spi_master, which will process requests in a 415 415 * dedicated task, keeping IRQs unblocked most of the time. To stop 416 416 * processing those requests, call spi_bitbang_stop(). 417 + * 418 + * On success, this routine will take a reference to master. The caller is 419 + * responsible for calling spi_bitbang_stop() to decrement the reference and 420 + * spi_master_put() as counterpart of spi_alloc_master() to prevent a memory 421 + * leak. 417 422 */ 418 423 int spi_bitbang_start(struct spi_bitbang *bitbang) 419 424 { 420 425 struct spi_master *master = bitbang->master; 426 + int ret; 421 427 422 428 if (!master || !bitbang->chipselect) 423 429 return -EINVAL; ··· 455 449 /* driver may get busy before register() returns, especially 456 450 * if someone registered boardinfo for devices 457 451 */ 458 - return spi_register_master(master); 452 + ret = spi_register_master(spi_master_get(master)); 453 + if (ret) 454 + spi_master_put(master); 455 + 456 + return 0; 459 457 } 460 458 EXPORT_SYMBOL_GPL(spi_bitbang_start); 461 459
+1 -1
drivers/spi/spi-butterfly.c
··· 225 225 master->bus_num = 42; 226 226 master->num_chipselect = 2; 227 227 228 - pp->bitbang.master = spi_master_get(master); 228 + pp->bitbang.master = master; 229 229 pp->bitbang.chipselect = butterfly_chipselect; 230 230 pp->bitbang.txrx_word[SPI_MODE_0] = butterfly_txrx_word_mode0; 231 231
+4 -6
drivers/spi/spi-davinci.c
··· 916 916 if (ret) 917 917 goto unmap_io; 918 918 919 - dspi->bitbang.master = spi_master_get(master); 919 + dspi->bitbang.master = master; 920 920 if (dspi->bitbang.master == NULL) { 921 921 ret = -ENODEV; 922 922 goto irq_free; ··· 925 925 dspi->clk = clk_get(&pdev->dev, NULL); 926 926 if (IS_ERR(dspi->clk)) { 927 927 ret = -ENODEV; 928 - goto put_master; 928 + goto irq_free; 929 929 } 930 930 clk_prepare_enable(dspi->clk); 931 931 ··· 1015 1015 free_clk: 1016 1016 clk_disable_unprepare(dspi->clk); 1017 1017 clk_put(dspi->clk); 1018 - put_master: 1019 - spi_master_put(master); 1020 1018 irq_free: 1021 1019 free_irq(dspi->irq, dspi); 1022 1020 unmap_io: ··· 1022 1024 release_region: 1023 1025 release_mem_region(dspi->pbase, resource_size(r)); 1024 1026 free_master: 1025 - kfree(master); 1027 + spi_master_put(master); 1026 1028 err: 1027 1029 return ret; 1028 1030 } ··· 1049 1051 1050 1052 clk_disable_unprepare(dspi->clk); 1051 1053 clk_put(dspi->clk); 1052 - spi_master_put(master); 1053 1054 free_irq(dspi->irq, dspi); 1054 1055 iounmap(dspi->base); 1055 1056 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1056 1057 release_mem_region(dspi->pbase, resource_size(r)); 1058 + spi_master_put(master); 1057 1059 1058 1060 return 0; 1059 1061 }
+1 -1
drivers/spi/spi-efm32.c
··· 347 347 348 348 ddata = spi_master_get_devdata(master); 349 349 350 - ddata->bitbang.master = spi_master_get(master); 350 + ddata->bitbang.master = master; 351 351 ddata->bitbang.chipselect = efm32_spi_chipselect; 352 352 ddata->bitbang.setup_transfer = efm32_spi_setup_transfer; 353 353 ddata->bitbang.txrx_bufs = efm32_spi_txrx_bufs;
+1 -1
drivers/spi/spi-fsl-dspi.c
··· 450 450 451 451 dspi = spi_master_get_devdata(master); 452 452 dspi->pdev = pdev; 453 - dspi->bitbang.master = spi_master_get(master); 453 + dspi->bitbang.master = master; 454 454 dspi->bitbang.chipselect = dspi_chipselect; 455 455 dspi->bitbang.setup_transfer = dspi_setup_transfer; 456 456 dspi->bitbang.txrx_bufs = dspi_txrx_transfer;
+2 -3
drivers/spi/spi-gpio.c
··· 467 467 } 468 468 #endif 469 469 470 - spi_gpio->bitbang.master = spi_master_get(master); 470 + spi_gpio->bitbang.master = master; 471 471 spi_gpio->bitbang.chipselect = spi_gpio_chipselect; 472 472 473 473 if ((master_flags & (SPI_MASTER_NO_TX | SPI_MASTER_NO_RX)) == 0) { ··· 486 486 487 487 status = spi_bitbang_start(&spi_gpio->bitbang); 488 488 if (status < 0) { 489 - spi_master_put(spi_gpio->bitbang.master); 490 489 gpio_free: 491 490 if (SPI_MISO_GPIO != SPI_GPIO_NO_MISO) 492 491 gpio_free(SPI_MISO_GPIO); ··· 509 510 510 511 /* stop() unregisters child devices too */ 511 512 status = spi_bitbang_stop(&spi_gpio->bitbang); 512 - spi_master_put(spi_gpio->bitbang.master); 513 513 514 514 if (SPI_MISO_GPIO != SPI_GPIO_NO_MISO) 515 515 gpio_free(SPI_MISO_GPIO); 516 516 if (SPI_MOSI_GPIO != SPI_GPIO_NO_MOSI) 517 517 gpio_free(SPI_MOSI_GPIO); 518 518 gpio_free(SPI_SCK_GPIO); 519 + spi_master_put(spi_gpio->bitbang.master); 519 520 520 521 return status; 521 522 }
+1 -1
drivers/spi/spi-imx.c
··· 786 786 master->num_chipselect = num_cs; 787 787 788 788 spi_imx = spi_master_get_devdata(master); 789 - spi_imx->bitbang.master = spi_master_get(master); 789 + spi_imx->bitbang.master = master; 790 790 791 791 for (i = 0; i < master->num_chipselect; i++) { 792 792 int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
+1 -1
drivers/spi/spi-lm70llp.c
··· 222 222 /* 223 223 * SPI and bitbang hookup. 224 224 */ 225 - pp->bitbang.master = spi_master_get(master); 225 + pp->bitbang.master = master; 226 226 pp->bitbang.chipselect = lm70_chipselect; 227 227 pp->bitbang.txrx_word[SPI_MODE_0] = lm70_txrx; 228 228 pp->bitbang.flags = SPI_3WIRE;
+1 -2
drivers/spi/spi-nuc900.c
··· 349 349 } 350 350 351 351 hw = spi_master_get_devdata(master); 352 - hw->master = spi_master_get(master); 352 + hw->master = master; 353 353 hw->pdata = dev_get_platdata(&pdev->dev); 354 354 hw->dev = &pdev->dev; 355 355 ··· 435 435 kfree(hw->ioarea); 436 436 err_pdata: 437 437 spi_master_put(hw->master); 438 - 439 438 err_nomem: 440 439 return err; 441 440 }
+1 -1
drivers/spi/spi-oc-tiny.c
··· 306 306 platform_set_drvdata(pdev, hw); 307 307 308 308 /* setup the state for the bitbang driver */ 309 - hw->bitbang.master = spi_master_get(master); 309 + hw->bitbang.master = master; 310 310 if (!hw->bitbang.master) 311 311 return err; 312 312 hw->bitbang.setup_transfer = tiny_spi_setup_transfer;
+2 -1
drivers/spi/spi-ppc4xx.c
··· 396 396 master->dev.of_node = np; 397 397 platform_set_drvdata(op, master); 398 398 hw = spi_master_get_devdata(master); 399 - hw->master = spi_master_get(master); 399 + hw->master = master; 400 400 hw->dev = dev; 401 401 402 402 init_completion(&hw->done); ··· 558 558 free_irq(hw->irqnum, hw); 559 559 iounmap(hw->regs); 560 560 free_gpios(hw); 561 + spi_master_put(master); 561 562 return 0; 562 563 } 563 564
+1 -1
drivers/spi/spi-s3c24xx.c
··· 524 524 hw = spi_master_get_devdata(master); 525 525 memset(hw, 0, sizeof(struct s3c24xx_spi)); 526 526 527 - hw->master = spi_master_get(master); 527 + hw->master = master; 528 528 hw->pdata = pdata = dev_get_platdata(&pdev->dev); 529 529 hw->dev = &pdev->dev; 530 530
+1 -1
drivers/spi/spi-sh-sci.c
··· 133 133 sp->info = dev_get_platdata(&dev->dev); 134 134 135 135 /* setup spi bitbang adaptor */ 136 - sp->bitbang.master = spi_master_get(master); 136 + sp->bitbang.master = master; 137 137 sp->bitbang.master->bus_num = sp->info->bus_num; 138 138 sp->bitbang.master->num_chipselect = sp->info->num_chipselect; 139 139 sp->bitbang.chipselect = sh_sci_spi_chipselect;
+1 -1
drivers/spi/spi-sirf.c
··· 632 632 if (ret) 633 633 goto free_master; 634 634 635 - sspi->bitbang.master = spi_master_get(master); 635 + sspi->bitbang.master = master; 636 636 sspi->bitbang.chipselect = spi_sirfsoc_chipselect; 637 637 sspi->bitbang.setup_transfer = spi_sirfsoc_setup_transfer; 638 638 sspi->bitbang.txrx_bufs = spi_sirfsoc_transfer;
+1 -1
drivers/spi/spi-xilinx.c
··· 372 372 master->mode_bits = SPI_CPOL | SPI_CPHA; 373 373 374 374 xspi = spi_master_get_devdata(master); 375 - xspi->bitbang.master = spi_master_get(master); 375 + xspi->bitbang.master = master; 376 376 xspi->bitbang.chipselect = xilinx_spi_chipselect; 377 377 xspi->bitbang.setup_transfer = xilinx_spi_setup_transfer; 378 378 xspi->bitbang.txrx_bufs = xilinx_spi_txrx_bufs;