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

spi: bitbang: Introduce spi_bitbang_init()

Move all of the code doing struct spi_bitbang initialization, so that
it can be paired with devm_spi_register_master() in order to avoid
having to call spi_bitbang_stop() explicitly.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Chris Healy <cphealy@gmail.com>
Cc: linux-spi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Andrey Smirnov and committed by
Mark Brown
45beec35 8b797490

+40 -27
+39 -27
drivers/spi/spi-bitbang.c
··· 335 335 336 336 /*----------------------------------------------------------------------*/ 337 337 338 + int spi_bitbang_init(struct spi_bitbang *bitbang) 339 + { 340 + struct spi_master *master = bitbang->master; 341 + 342 + if (!master || !bitbang->chipselect) 343 + return -EINVAL; 344 + 345 + mutex_init(&bitbang->lock); 346 + 347 + if (!master->mode_bits) 348 + master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags; 349 + 350 + if (master->transfer || master->transfer_one_message) 351 + return -EINVAL; 352 + 353 + master->prepare_transfer_hardware = spi_bitbang_prepare_hardware; 354 + master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware; 355 + master->transfer_one = spi_bitbang_transfer_one; 356 + master->set_cs = spi_bitbang_set_cs; 357 + 358 + if (!bitbang->txrx_bufs) { 359 + bitbang->use_dma = 0; 360 + bitbang->txrx_bufs = spi_bitbang_bufs; 361 + if (!master->setup) { 362 + if (!bitbang->setup_transfer) 363 + bitbang->setup_transfer = 364 + spi_bitbang_setup_transfer; 365 + master->setup = spi_bitbang_setup; 366 + master->cleanup = spi_bitbang_cleanup; 367 + } 368 + } 369 + 370 + return 0; 371 + } 372 + EXPORT_SYMBOL_GPL(spi_bitbang_init); 373 + 338 374 /** 339 375 * spi_bitbang_start - start up a polled/bitbanging SPI master driver 340 376 * @bitbang: driver handle ··· 404 368 struct spi_master *master = bitbang->master; 405 369 int ret; 406 370 407 - if (!master || !bitbang->chipselect) 408 - return -EINVAL; 409 - 410 - mutex_init(&bitbang->lock); 411 - 412 - if (!master->mode_bits) 413 - master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags; 414 - 415 - if (master->transfer || master->transfer_one_message) 416 - return -EINVAL; 417 - 418 - master->prepare_transfer_hardware = spi_bitbang_prepare_hardware; 419 - master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware; 420 - master->transfer_one = spi_bitbang_transfer_one; 421 - master->set_cs = spi_bitbang_set_cs; 422 - 423 - if (!bitbang->txrx_bufs) { 424 - bitbang->use_dma = 0; 425 - bitbang->txrx_bufs = spi_bitbang_bufs; 426 - if (!master->setup) { 427 - if (!bitbang->setup_transfer) 428 - bitbang->setup_transfer = 429 - spi_bitbang_setup_transfer; 430 - master->setup = spi_bitbang_setup; 431 - master->cleanup = spi_bitbang_cleanup; 432 - } 433 - } 371 + ret = spi_bitbang_init(bitbang); 372 + if (ret) 373 + return ret; 434 374 435 375 /* driver may get busy before register() returns, especially 436 376 * if someone registered boardinfo for devices
+1
include/linux/spi/spi_bitbang.h
··· 44 44 45 45 /* start or stop queue processing */ 46 46 extern int spi_bitbang_start(struct spi_bitbang *spi); 47 + extern int spi_bitbang_init(struct spi_bitbang *spi); 47 48 extern void spi_bitbang_stop(struct spi_bitbang *spi); 48 49 49 50 #endif /* __SPI_BITBANG_H */