summaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-xilinx.c
Commit message (Collapse)AuthorAgeFilesLines
* spi: xilinx: Return IRQ_NONE if no interrupts were detectedLars-Peter Clausen2016-07-151-1/+2
| | | | | | | | | | | Return IRQ_NONE from the interrupt handler if the handler is running, but no interrupt was detected. This allows the system to recover in case of an interrupt storm due to an invalid interrupt configuration or faulty hardware. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi: xilinx: Handle errors from platform_get_irq()Lars-Peter Clausen2016-07-151-1/+4
| | | | | | | | | | | | | | The Xilinx SPI driver can operate without an IRQ, but not every error returned by platform_get_irq() means that no IRQ was specified. It will also return an error if the IRQ specification is invalid or the IRQ provider is not yet available (EPROBE_DEFER). So instead of ignoring all errors only ignore ENXIO, which means no IRQ was specified, and propagate all other errors to device driver core. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/spi-xilinx: Fix race condition on last word readRicardo Ribalda Delgado2015-10-291-14/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Some users have reported that in polled mode the driver fails randomly to read the last word of the transfer. The end condition used for the transmissions (in polled and irq mode) has been the TX_EMPTY flag. But Lars-Peter Clausen has identified a delay from the TX_EMPTY to the actual end of the data rx. I believe that this race condition has not been detected until now because of the latency added by the IRQ handler or the PCIe bridge. This bugs affects setups with low latency access to the spi core. This patch replaces the readout logic: For all the words, except the last one, the TX_EMPTY flag is used (and cached). If !TX_EMPY or is the last word. The status register is read and the RX_EMPTY flag is used. The performance is not affected: there is an extra read of the Status Register, but the readout can start as soon as there is a word in the buffer. Reported-by: Edward Kigwana <ekigwana@scires.com> Initial-fix-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
* spi/spi-xilinx: Fix spurious IRQ ACK on irq modeRicardo Ribalda Delgado2015-08-141-6/+10
| | | | | | | | | | | | | The ACK of an inexistent IRQ can trigger an spurious IRQ that breaks the txrx logic. This has been observed on axi_quad_spi:3.2 core. This patch only ACKs IRQs that have not been Acknowledge jet. Reported-by: Edward Kigwana <ekigwana@scires.com> Tested-by: Edward Kigwana <ekigwana@scires.com> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
* spi/spi-xilinx: Fix mixed poll/irq modeRicardo Ribalda Delgado2015-08-131-1/+3
| | | | | | | | | | | Once the module process a transfer in irq mode, the next poll transfer will not work because the transmitter is left in inhibited state. Fixes: 22417352f6b7f623 (Use polling mode on small transfers) Reported-by: Edward Kigwana <ekigwana@scires.com> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
* spi/xilinx: Fix access invalid memory on xilinx_spi_txRicardo Ribalda Delgado2015-02-021-1/+16
| | | | | | | | | | | | On 1 and 2 bytes per word, the transfer of the 3 last bytes will access memory outside tx_ptr. Although this has not trigger any error on real hardware, we should better fix this. Fixes: 24ba5e593f391507 (Remove rx_fn and tx_fn pointer) Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi: Revert "spi/xilinx: Remove iowrite/ioread wrappers"Mark Brown2015-01-301-4/+24
| | | | | | | | This reverts commit 99082eab63449f9dfa83d5157fa6d78bfc1b04d7 since it breaks the build due to differing implementations of iowrite() and ioread(). Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Check number of slaves rangeRicardo Ribalda2015-01-281-0/+7
| | | | | | | | The core only supports up to 32 slaves, and the chipselect function expects the same. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Use polling mode on small transfersRicardo Ribalda Delgado2015-01-281-18/+25
| | | | | | | | | | Small transfers generally can be accomplished faster in polling mode. This patch select the transfer which size is bellow the buffer size to be done on polling mode Suggested-by: Mark Brown <broonie@kernel.org> Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Remove remaining_words driver data variableRicardo Ribalda Delgado2015-01-281-16/+12
| | | | | | | The variable never leaves the scope of txrx_bufs. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Remove iowrite/ioread wrappersRicardo Ribalda Delgado2015-01-281-24/+4
| | | | | | | Save a stack level and cleanup code. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Convert bits_per_word in bytes_per_wordRicardo Ribalda Delgado2015-01-281-9/+9
| | | | | | | Simplify the code by using the unit used on most of the code logic. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Convert remainding_bytes in remaining wordsRicardo Ribalda Delgado2015-01-281-7/+6
| | | | | | | Simplify the code by using the unit used on most of the code logic. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Make spi_tx and spi_rx simmetricRicardo Ribalda Delgado2015-01-281-4/+5
| | | | | | | | spi_rx handles the case where the buffer is null. Nevertheless spi_tx did not handle it, and was handled by the caller function. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Remove rx_fn and tx_fn pointerRicardo Ribalda Delgado2015-01-281-51/+18
| | | | | | | | Simplify the code by removing the tx and and rx function pointers and substitute them by a single function. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Support for spi mode CS_HIGHRicardo Ribalda Delgado2015-01-281-24/+38
| | | | | | | | | | The core controls the chip select lines individually. By default, all the lines are consider active_low. After spi_setup_transfer, it has its real value. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Do not inhibit transmission in polling modeRicardo Ribalda Delgado2015-01-281-10/+15
| | | | | | | | | When no irq is used, there is no need to inhibit the transmission for every transaction. This inhibition was implemented to avoid a race condition with the irq handler. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Support cores with no interruptRicardo Ribalda Delgado2015-01-281-14/+19
| | | | | | | | | | | | | The core can run in polling mode. In fact, the performance of the core is similar (or even better), due to the fact most of the spi transactions are just a couple of bytes and there is one irq per transactions. When an mtd device is connected via spi, reading 8MB of data produces more than 80K interrupts (with irq disabling, context swith....) Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Use cached value of registerRicardo Ribalda Delgado2015-01-281-1/+0
| | | | | | | | The control register has not changed since the previous access. Therefore we can use the cached value and safe one bus access. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Code cleanupRicardo Ribalda Delgado2015-01-281-5/+1
| | | | | | | | | | On the transmission loop, check for remaining bytes at the loop condition. This way we can handle transmissions of 0 bytes and clean the code. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Leave the IRQ always enabled.Ricardo Ribalda Delgado2015-01-281-14/+5
| | | | | | | | | | Instead of enabling the IRQ and disabling it for every transaction. Specially the small transactions (1,2 words) benefit from removing 3 bus accesses. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Simplify spi_fill_tx_fifoRicardo Ribalda Delgado2015-01-281-13/+33
| | | | | | | | | | | Instead of checking the TX_FULL flag for every transaction, find out the size of the buffer at probe time and use it. To avoid situations where the core had some data on the buffer before initialization, the core is reseted before the buffer size is detected Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Simplify data read from the Rx FIFORicardo Ribalda Delgado2015-01-271-7/+8
| | | | | | | | | | | | The number of words in the read buffer will be exactly the same as the number of words written on write buffer, once the transaction has finished. Instead of cheking the rx_empty flags for every word simply save the number of words written by fill_tx_fifo. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Support for spi mode LOOPRicardo Ribalda Delgado2015-01-261-2/+4
| | | | | | | Hardware supports LOOP mode. Support it also in the driver. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi/xilinx: Support for spi mode LSB_FIRSTRicardo Ribalda Delgado2015-01-261-2/+5
| | | | | | | Hardware supports LSB_FIRST mode. Support it also in the driver. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
* spi: xilinx: Remove .owner field for driverMichal Simek2014-08-161-1/+0
| | | | | | | | | | | | | | There is no need to init .owner field. Based on the patch from Peter Griffin <peter.griffin@linaro.org> "mmc: remove .owner field for drivers using module_platform_driver" This patch removes the superflous .owner field for drivers which use the module_platform_driver API, as this is overriden in platform_driver_register anyway." Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
* spi: xilinx: Use pdev->id instead of pdev->dev.id for the SPI bus numberLars-Peter Clausen2014-07-101-1/+1
| | | | | | | | | | | | | The Xilinx SPI driver initializes the bus_num field of the SPI master to pdev->dev.id. pdev->dev.id is always 0 for platform devices which causes bus number conflicts for the SPI controller when creating multiple device instances of the driver. Instead use pdev->id which will have the assignt platform device id. If the device is instantiated via devicetree pdev->id is -1 which will cause the SPI core to dynamically assign a id (or use the id defined via a alias in the devicetree). Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Mark Brown <broonie@linaro.org>
*-. Merge remote-tracking branches 'spi/topic/xilinx' and 'spi/topic/xtfpga' ↵Mark Brown2014-03-301-20/+6
|\ \ | | | | | | | | | into spi-next
| * | spi: xilinx: remove unnecessary spacesJingoo Han2014-02-271-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Remove unnecessary space in order to fix the following checkpatch issues. WARNING: Unnecessary space after function pointer name Signed-off-by: Jingoo Han <jg1.han@samsung.com> Reviewed-by: Michal Simek <monstr@monstr.eu> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi: xilinx: Convert to let spi core validate bits_per_wordAxel Lin2014-02-231-16/+2
| |/ | | | | | | | | | | | | | | | | | | | | | | | | Set bits_per_word_mask so spi core will reject transfers that attempt to use an unsupported bits_per_word value. spi_bitbang requires custom setup_transfer() to be defined if there is a custom txrx_bufs(). Thus keep the empty xilinx_spi_setup_transfer() function in the code. Signed-off-by: Axel Lin <axel.lin@ingics.com> Acked-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
* | spi: delete non-required instances of include <linux/init.h>Paul Gortmaker2014-02-031-1/+0
|/ | | | | | | | | | None of these files are actually using any __init type directives and hence don't need to include <linux/init.h>. Most are just a left over from __devinit and __cpuinit removal, or simply due to code getting copied from one driver to the next. Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: Mark Brown <broonie@linaro.org>
* tree-wide: use reinit_completion instead of INIT_COMPLETIONWolfram Sang2013-11-151-1/+1
| | | | | | | | | | | | Use this new function to make code more comprehensible, since we are reinitialzing the completion, not initializing. [akpm@linux-foundation.org: linux-next resyncs] Signed-off-by: Wolfram Sang <wsa@the-dreams.de> Acked-by: Linus Walleij <linus.walleij@linaro.org> (personally at LCE13) Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
* spi: bitbang: Let spi_bitbang_start() take a reference to masterAxel Lin2013-09-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* Merge remote-tracking branch 'spi/topic/pdata' into spi-nextMark Brown2013-09-011-106/+66
|\
| * Merge remote-tracking branch 'spi/topic/rspi' into spi-pdataMark Brown2013-08-291-0/+16
| |\ | | | | | | | | | | | | Conflicts: drivers/spi/spi-rspi.c
| * | spi: use dev_get_platdata()Jingoo Han2013-08-291-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | Use the wrapper function for retrieving the platform data instead of accessing dev->platform_data directly. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: signedness issue checking platform_get_irq()Dan Carpenter2013-07-171-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | In xilinx_spi_probe() we use xspi->irq to store negative error codes so it has to be signed. We weren't going to use the upper bit any way so this is fine. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Simplify irq allocationMichal Simek2013-07-151-13/+16
| | | | | | | | | | | | | | | | | | | | | | | | Use devm_request_irq() for irq allocation which simplify driver code. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Use of_property_read_u32 for reading value from nodeMichal Simek2013-07-151-11/+3
| | | | | | | | | | | | | | | | | | | | | It simplifies driver probing. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Clean ioremap callingMichal Simek2013-07-151-9/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | devm_ioremap_resource() automatically checks that struct resource is initialized. Also group platform_get_resource() and devm_ioremap_resource() together. And remove mem resource from struct xilinx_spi. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Remove CONFIG_OF from the driverMichal Simek2013-07-151-2/+0
| | | | | | | | | | | | | | | | | | | | | dev.of_node is in struct device all the time. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Refer to platform device as pdev in probe() and remove()Mark Brown2013-07-151-16/+17
| | | | | | | | | | | | | | | | | | | | | | | | This is a more traditional name and makes things a bit clearer when referring to actual struct devices as we do frequently during probe(). Signed-off-by: Mark Brown <broonie@linaro.org> Acked-by: Michal Simek <michal.simek@xilinx.com>
| * | spi/xilinx: Remove remains of of_platform device registrationMark Brown2013-07-151-82/+63
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In the past there used to be a separate platform device type for device tree systems so the probe and removal functions were split into generic and bus sections. Since this is no longer the case simplify the code (and remove some unprototyped exports) by factoring everything into the bus probe() and remove(). Signed-off-by: Mark Brown <broonie@linaro.org>
| * | spi/xilinx: Convert to devm_ioremap_resource()Mark Brown2013-07-151-15/+5
| | | | | | | | | | | | | | | | | | Saves code and reduces the possibility of error. Signed-off-by: Mark Brown <broonie@linaro.org>
* | | spi/bitbang: Drop empty setup() functionsMark Brown2013-08-091-16/+0
| |/ |/| | | | | | | | | | | Now that the bitbang core does not require a setup() function we can drop the check in the altera, nuc900 and xilinx drivers. Signed-off-by: Mark Brown <broonie@linaro.org>
* | spi/xilinx: Revert master->setup function removalMichal Simek2013-07-101-0/+16
|/ | | | | | | | | | | | master->setup() must be initialized to be able to successfully run spi_bitbang_start() and satisfy if/else logic there. "spi: convert drivers to use bits_per_word_mask" (sha1: 24778be20f87d5aadb19624fc768b3159fa43efc) Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
* Merge remote-tracking branch 'spi/topic/xilinx' into spi-nextMark Brown2013-06-261-9/+21
|\
| * spi: spi-xilinx: Remove redundant platform_set_drvdata()Sachin Kamat2013-06-041-1/+0
| | | | | | | | | | | | | | | | | | Setting platform data to NULL is not necessary. Also fixes the following sparse warning: drivers/spi/spi-xilinx.c:508:35: warning: Using plain integer as NULL pointer Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org> Signed-off-by: Mark Brown <broonie@linaro.org>
| * spi: spi-xilinx: Add run run-time endian detectionMichal Simek2013-06-041-8/+21
| | | | | | | | | | | | | | | | Do not load endian value from platform data and rather autodetect it. Signed-off-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Mark Brown <broonie@linaro.org>
* | Merge remote-tracking branch 'spi/topic/bpw' into spi-nextMark Brown2013-06-261-16/+0
|\ \
OpenPOWER on IntegriCloud