.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * polling/bitbanging SPI master controller driver utilities |
---|
3 | | - * |
---|
4 | | - * This program is free software; you can redistribute it and/or modify |
---|
5 | | - * it under the terms of the GNU General Public License as published by |
---|
6 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
7 | | - * (at your option) any later version. |
---|
8 | | - * |
---|
9 | | - * This program is distributed in the hope that it will be useful, |
---|
10 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
11 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
12 | | - * GNU General Public License for more details. |
---|
13 | 4 | */ |
---|
14 | 5 | |
---|
15 | 6 | #include <linux/spinlock.h> |
---|
.. | .. |
---|
183 | 174 | } |
---|
184 | 175 | EXPORT_SYMBOL_GPL(spi_bitbang_setup_transfer); |
---|
185 | 176 | |
---|
186 | | -/** |
---|
| 177 | +/* |
---|
187 | 178 | * spi_bitbang_setup - default setup for per-word I/O loops |
---|
188 | 179 | */ |
---|
189 | 180 | int spi_bitbang_setup(struct spi_device *spi) |
---|
190 | 181 | { |
---|
191 | 182 | struct spi_bitbang_cs *cs = spi->controller_state; |
---|
192 | 183 | struct spi_bitbang *bitbang; |
---|
| 184 | + bool initial_setup = false; |
---|
| 185 | + int retval; |
---|
193 | 186 | |
---|
194 | 187 | bitbang = spi_master_get_devdata(spi->master); |
---|
195 | 188 | |
---|
.. | .. |
---|
198 | 191 | if (!cs) |
---|
199 | 192 | return -ENOMEM; |
---|
200 | 193 | spi->controller_state = cs; |
---|
| 194 | + initial_setup = true; |
---|
201 | 195 | } |
---|
202 | 196 | |
---|
203 | 197 | /* per-word shift register access, in hardware or bitbanging */ |
---|
204 | 198 | cs->txrx_word = bitbang->txrx_word[spi->mode & (SPI_CPOL|SPI_CPHA)]; |
---|
205 | | - if (!cs->txrx_word) |
---|
206 | | - return -EINVAL; |
---|
| 199 | + if (!cs->txrx_word) { |
---|
| 200 | + retval = -EINVAL; |
---|
| 201 | + goto err_free; |
---|
| 202 | + } |
---|
207 | 203 | |
---|
208 | 204 | if (bitbang->setup_transfer) { |
---|
209 | | - int retval = bitbang->setup_transfer(spi, NULL); |
---|
| 205 | + retval = bitbang->setup_transfer(spi, NULL); |
---|
210 | 206 | if (retval < 0) |
---|
211 | | - return retval; |
---|
| 207 | + goto err_free; |
---|
212 | 208 | } |
---|
213 | 209 | |
---|
214 | 210 | dev_dbg(&spi->dev, "%s, %u nsec/bit\n", __func__, 2 * cs->nsecs); |
---|
215 | 211 | |
---|
216 | | - /* NOTE we _need_ to call chipselect() early, ideally with adapter |
---|
217 | | - * setup, unless the hardware defaults cooperate to avoid confusion |
---|
218 | | - * between normal (active low) and inverted chipselects. |
---|
219 | | - */ |
---|
220 | | - |
---|
221 | | - /* deselect chip (low or high) */ |
---|
222 | | - mutex_lock(&bitbang->lock); |
---|
223 | | - if (!bitbang->busy) { |
---|
224 | | - bitbang->chipselect(spi, BITBANG_CS_INACTIVE); |
---|
225 | | - ndelay(cs->nsecs); |
---|
226 | | - } |
---|
227 | | - mutex_unlock(&bitbang->lock); |
---|
228 | | - |
---|
229 | 212 | return 0; |
---|
| 213 | + |
---|
| 214 | +err_free: |
---|
| 215 | + if (initial_setup) |
---|
| 216 | + kfree(cs); |
---|
| 217 | + return retval; |
---|
230 | 218 | } |
---|
231 | 219 | EXPORT_SYMBOL_GPL(spi_bitbang_setup); |
---|
232 | 220 | |
---|
233 | | -/** |
---|
| 221 | +/* |
---|
234 | 222 | * spi_bitbang_cleanup - default cleanup for per-word I/O loops |
---|
235 | 223 | */ |
---|
236 | 224 | void spi_bitbang_cleanup(struct spi_device *spi) |
---|
.. | .. |
---|
348 | 336 | |
---|
349 | 337 | /*----------------------------------------------------------------------*/ |
---|
350 | 338 | |
---|
| 339 | +int spi_bitbang_init(struct spi_bitbang *bitbang) |
---|
| 340 | +{ |
---|
| 341 | + struct spi_master *master = bitbang->master; |
---|
| 342 | + bool custom_cs; |
---|
| 343 | + |
---|
| 344 | + if (!master) |
---|
| 345 | + return -EINVAL; |
---|
| 346 | + /* |
---|
| 347 | + * We only need the chipselect callback if we are actually using it. |
---|
| 348 | + * If we just use GPIO descriptors, it is surplus. If the |
---|
| 349 | + * SPI_MASTER_GPIO_SS flag is set, we always need to call the |
---|
| 350 | + * driver-specific chipselect routine. |
---|
| 351 | + */ |
---|
| 352 | + custom_cs = (!master->use_gpio_descriptors || |
---|
| 353 | + (master->flags & SPI_MASTER_GPIO_SS)); |
---|
| 354 | + |
---|
| 355 | + if (custom_cs && !bitbang->chipselect) |
---|
| 356 | + return -EINVAL; |
---|
| 357 | + |
---|
| 358 | + mutex_init(&bitbang->lock); |
---|
| 359 | + |
---|
| 360 | + if (!master->mode_bits) |
---|
| 361 | + master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags; |
---|
| 362 | + |
---|
| 363 | + if (master->transfer || master->transfer_one_message) |
---|
| 364 | + return -EINVAL; |
---|
| 365 | + |
---|
| 366 | + master->prepare_transfer_hardware = spi_bitbang_prepare_hardware; |
---|
| 367 | + master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware; |
---|
| 368 | + master->transfer_one = spi_bitbang_transfer_one; |
---|
| 369 | + /* |
---|
| 370 | + * When using GPIO descriptors, the ->set_cs() callback doesn't even |
---|
| 371 | + * get called unless SPI_MASTER_GPIO_SS is set. |
---|
| 372 | + */ |
---|
| 373 | + if (custom_cs) |
---|
| 374 | + master->set_cs = spi_bitbang_set_cs; |
---|
| 375 | + |
---|
| 376 | + if (!bitbang->txrx_bufs) { |
---|
| 377 | + bitbang->use_dma = 0; |
---|
| 378 | + bitbang->txrx_bufs = spi_bitbang_bufs; |
---|
| 379 | + if (!master->setup) { |
---|
| 380 | + if (!bitbang->setup_transfer) |
---|
| 381 | + bitbang->setup_transfer = |
---|
| 382 | + spi_bitbang_setup_transfer; |
---|
| 383 | + master->setup = spi_bitbang_setup; |
---|
| 384 | + master->cleanup = spi_bitbang_cleanup; |
---|
| 385 | + } |
---|
| 386 | + } |
---|
| 387 | + |
---|
| 388 | + return 0; |
---|
| 389 | +} |
---|
| 390 | +EXPORT_SYMBOL_GPL(spi_bitbang_init); |
---|
| 391 | + |
---|
351 | 392 | /** |
---|
352 | 393 | * spi_bitbang_start - start up a polled/bitbanging SPI master driver |
---|
353 | 394 | * @bitbang: driver handle |
---|
.. | .. |
---|
381 | 422 | struct spi_master *master = bitbang->master; |
---|
382 | 423 | int ret; |
---|
383 | 424 | |
---|
384 | | - if (!master || !bitbang->chipselect) |
---|
385 | | - return -EINVAL; |
---|
386 | | - |
---|
387 | | - mutex_init(&bitbang->lock); |
---|
388 | | - |
---|
389 | | - if (!master->mode_bits) |
---|
390 | | - master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags; |
---|
391 | | - |
---|
392 | | - if (master->transfer || master->transfer_one_message) |
---|
393 | | - return -EINVAL; |
---|
394 | | - |
---|
395 | | - master->prepare_transfer_hardware = spi_bitbang_prepare_hardware; |
---|
396 | | - master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware; |
---|
397 | | - master->transfer_one = spi_bitbang_transfer_one; |
---|
398 | | - master->set_cs = spi_bitbang_set_cs; |
---|
399 | | - |
---|
400 | | - if (!bitbang->txrx_bufs) { |
---|
401 | | - bitbang->use_dma = 0; |
---|
402 | | - bitbang->txrx_bufs = spi_bitbang_bufs; |
---|
403 | | - if (!master->setup) { |
---|
404 | | - if (!bitbang->setup_transfer) |
---|
405 | | - bitbang->setup_transfer = |
---|
406 | | - spi_bitbang_setup_transfer; |
---|
407 | | - master->setup = spi_bitbang_setup; |
---|
408 | | - master->cleanup = spi_bitbang_cleanup; |
---|
409 | | - } |
---|
410 | | - } |
---|
| 425 | + ret = spi_bitbang_init(bitbang); |
---|
| 426 | + if (ret) |
---|
| 427 | + return ret; |
---|
411 | 428 | |
---|
412 | 429 | /* driver may get busy before register() returns, especially |
---|
413 | 430 | * if someone registered boardinfo for devices |
---|
.. | .. |
---|
420 | 437 | } |
---|
421 | 438 | EXPORT_SYMBOL_GPL(spi_bitbang_start); |
---|
422 | 439 | |
---|
423 | | -/** |
---|
| 440 | +/* |
---|
424 | 441 | * spi_bitbang_stop - stops the task providing spi communication |
---|
425 | 442 | */ |
---|
426 | 443 | void spi_bitbang_stop(struct spi_bitbang *bitbang) |
---|