18 Nov, 2010

40 commits

  • The "clk_internal" platform data member which contols the
    CLKMOD bit in Global Control Register 1 is not useful
    since CLKMOD needs be set to 1 *always* to ensure master
    mode operation.

    Remove this platform data.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Let DMA operation be specified on a per-device basis instead
    of selecting it once during probe.

    A side effect of this is the need to combine the PIO and DMA buffer
    txrx_bufs routine. This is good since they anyway share some common
    functionality.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The DMA code does not use the existing completion variable 'done'
    which is being used for interrupt mode transfers. Instead it uses
    two different completion variables specific to DMA mode transfers.

    Eliminate the usage of new completion variables for DMA mode and
    use the existing completion variable.

    [nsekhar@ti.com: To make this process easy, eliminate the two
    different DMA completion callback functions for tx and rx and
    use a single callback function instead]

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Do not simply clean the DMA channel on a DMA completion
    error. Instead, use wcount and rcount members of davinci_spi
    to detecion non-completion of DMA and signal EIO to the
    application.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Use a dummy param slot linked to itself to take care of the
    extra "sync event" that gets sent to EDMA controller after
    the last byte has been transferred.

    The dummy PaRAM slot that is linked to the actual DMA PaRAM
    slot "absorbs" this event and prevents a EDMA CC error to
    be asserted.

    Without this provision, the EDMA CC error would be asserted
    because the channel PaRAM would be empty after the transfer
    and EDMA would not know what to make out of the extra sync
    event.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Do not allocate (and de-allocate) SPI DMA channels during setup
    (and cleanup) for each SPI device. Instead, allocate the DMA
    channels once duing probe and use them for the life time of
    the driver.

    This makes sense since there are dedicated DMA channels meant
    for SPI use.

    This also helps remove the unnecessary DMA "sync_dev" variables
    being used to store DMA channel information.

    Also, the "use_dma" platform variable is now eliminated since
    it is possible to check if the platform supports DMA or not
    based upon whether DMA resources can be found or not.

    Tested-By: Michael Williamson
    Tested-By: Brian Niebuhr
    Signed-off-by: Sekhar Nori

    Sekhar Nori
     
  • Do not stop SPI DMA event generation in either transmit or
    receive DMA event call back because the single setting affects
    both transmit and receive event generation.

    Depending on the order in which the callbacks happen, transmit
    or receive events can get unintentionally stalled.

    Instead, disable event generation once after both the transmit
    and receive DMA completes.

    While at it, remove the largely under-used function to set or
    clear DMA event generation.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Currently a series of EDMA API calls are being made to setup
    various aspects of EDMA PaRAM slots for receive and transmit.

    Instead setup the PaRAM using a local structure and write once
    to the hardware using edma_write_slot()

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • In keeping with the full duplex nature of the SPI bus. Always
    start receive DMA along with transmit DMA.

    If there is no receive buffer provided with the transfer, use
    a temporary buffer to receive the data to be thrown away.

    [michael.williamson@criticallink.com: receive DMA size should
    be same as transfer length to avoid hang-up when transfer length
    is smaller than temporary rx buffer size (rx buffer not provided)]

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Remove usage of temporary buffer when no transmit data is provided.
    Instead, use the transmit register itself as the source of data.

    By choosing the transmit register itself as the source of data, this
    patch helps remove unnecessary accesses to memory when no real data
    is being transmitted.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Due to the full duplex nature of the SPI bus, the SPI master
    on DaVinci needs transmit to be active even if the tranfer is
    only meant to collect receive data.

    The current code achieves this by using a temporary zeroed buffer
    to provide DMA data in case the transfer does not have a transmit
    buffer provided.

    However, the transmit DMA is started only if transmit buffer is
    provided rendering the temporary buffer unused. Instead the code
    relies on a write to SPIDAT1 register to trigger transmit operation.
    This however only sends two bytes of data.

    Fix this by starting transmit DMA always.

    This changes exposes a bug on DM355 where the CSHOLD bit in
    SPIDAT1 needs to be written to in between transfers. Handle
    that by introducing a "cshold_bug" platform data which is
    set to true for DM355.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Do not store DMA channel related information per chip-select since
    that information does not depend on the chip select.

    The same DMA channels can be used for transfers on all chip-selects
    since the transfer happens one-at-a-time.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Remove unnecessary call to davinci_spi_setup_transfer() at the end
    of davinci_spi_setup().

    davinci_spi_setup_transfer() is registered as the setup_transfer
    callback for the bitbang layer and is called independently by
    the bitbang layer to setup the transfer before it begins.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The function davinci_spi_bufs_prep() is doing stuff that
    davinci_spi_setup() is doing. Eliminate it and move the work
    to davinci_spi_setup()

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Configure the data-in, data-out and clock functionality pins
    in SPIPC0 register only once during probe. No need to set these
    bits for each transfer.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Add support for SPI interrupt mode operation.

    Define a per chip-select "io type" variable which
    specifies if the transfers on this chip-select should
    happen in interrupt mode or polled mode.

    Introduce a new function davinci_spi_process_events()
    to help consolidate the code between interrupt mode
    processing and polled mode processing.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Use the fact that the get_tx and get_rx can now cope with
    NULL buffer pointers to simplify the poll mode transfer
    code.

    While at it, check for SPI errors every transfer rather than
    at the end of the whole transfer.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The interrupt mode support as it stands is another version
    of poll mode. Even when interrupt mode is selected, the code
    tight loops on interrupt status register, rendering it totally
    useless. A completion variable is initialized, but never used.

    Remove this fake interrupt mode since users can anyway use
    poll mode with no functional difference. A usefully implemented
    interrupt mode support can be added later.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The completion variable 'done' is unnecessarly initialized by
    the function davinci_spi_bufs_dma() where as it is not used
    for DMA transfers at all.

    Remove the unnecessary initialization.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • In davinci_spi_check_error(), Tx interrupt being set is
    treated as error. This function is only meant to flag
    bus error conditions and Tx interrupt being set at that
    point is not a bus error but rather a driver bug.

    Stop checking for Tx interrupt and flagging that as an
    IO error.

    Tested-By: Michael Williamson
    Tested-By: Brian Niebuhr
    Signed-off-by: Sekhar Nori

    Sekhar Nori
     
  • The variable count in DaVinci SPI driver's private data is
    largely unused and its minor use can easily be eliminated.

    Remove the variable.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • In the davinci_spi_bufs_dma() function, SPI is briefly disabled
    before enabling it immediately back again.

    Remove this unnecessary disable.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • In the davinci_spi_{tx|rx}_u{8|16}() functions, check for
    buffer pointer being valid before using it. While providing
    for better error checking, this change will help simplify
    code in the caller.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The EDMA acount (called data_type in davinci_spi_bufs_dma())
    is simply the bytes_per_word obtained in the transfer setup
    function. The current code calculates the acount value from
    bytes_per_word in a convoluted manner. Simplify the code.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The count member of davinci_spi is internal to the driver and
    is not shared with framework. Eliminate its unnecessary update.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The struct davinci_spi_slave has a single member. Eliminate it
    and store the per-chipselect data in struct davinci_spi directly.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Several members of struct davinci_spi_slave are unused in code.
    Remove such members.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Just enabling WAITENA in SPIFMTn register waits for the
    enable signal from the slave indefinitely. Allow support
    for finite waiting by adding support for c2e delay
    (maximum time for addressed slave to respond) and t2e
    delay (maximum time for slave to respond after transmit
    data finished).

    While at it, modify the T2C and C2T defines by prepending
    the register name as is the convention followed for other
    register field elsewhere in the driver.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Setup chip-select timers values only if timer is enabled
    (timer_disbled in spi configuration is false).

    As a nice side effect, this patch removes code duplicated in
    davinci_spi_bufs_pio() and davinci_spi_bufs_dma().

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Consolidate the setup of SPIFMTn register under
    davinci_spi_setup_transfer() simplifying the code
    and avoiding unnecessary reads and writes to the
    register.

    The two inline functions {set|clear}_fmt_bits() can
    be eliminated because of this.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Some chip-select specific paramterers like wdelay, parity, usage of
    chip-select timers (and the actual timer values) are included in
    platform data forcing the same behaviour across all chip-selects.

    Create a new davinci_spi_config data structure which can be passed
    along using controller_data member of spi_device data structure
    on a per-device basis.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The SPI_READY bit of struct spi_device:mode serves the purpose
    of letting the SPI master know if the slave can signal if it is
    ready for transfer or not.

    The 'wait_enable' platform data was duplicating this functionality.
    Use the framework provided method of indicating this capability.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Simplify pre-scalar calculation and move it into a seprate
    function.

    Refuse to correct invalid pre-scalar values silently as this
    might lead to unexpected bugs and lower performance. Instead
    an error will force users to dig into the root-cause of the
    issue.

    While at it, remove some device specific checks on the maximum
    SPI frequency. As the driver supports the SPI interface
    implemented on various devices, it should only take care of core
    SPI limitations and leave the device specific handling to platform
    code.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Sometimes, the chip selects provided by SPI module are
    muxed with other functionality and cannot be used in
    some designs. In such cases, it becomes convenient to use
    an available GPIO line as chip select.

    This patch enables the DaVinci SPI driver to treat specific
    GPIO lines as chip selects based on information provided in
    platform data.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • On TI DaVinci's SPI controller, the SPIDAT1 register which
    controls the chip slect status, also has data transmit register
    in the lower 16 bits. Writing to the whole 32-bits triggers
    an additional data transmit every time the chip select is disabled.

    While most SPI slaves cope-up with this, some cannot. This
    patch fixes this by doing a 16-bit write on the upper half
    of the SPIDAT1 register

    While at it, group the SPIGCR1 register related defines seperately
    from SPIDAT1 register defines.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Let davinci_spi_chipselect() perform both activation and
    deactivation of chip selects. This lets spi_bitbang fully
    control chip select activation, as intended by the SPI API.

    With this change, the chip select activation code need not
    be duplicated in davinci_spi_bufs_{pio|dma}().

    Also, keeping chip select active control is removed as a
    platform data and simply controlled using information from
    spi_bitbang on whether chip slect should be activated or
    de-activated.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • Quit writing the same constant value determining the chip-select
    mode when no transmissions are in progress in davinci_spi_chipelect().

    Instead just setup the SPIDEF register once during probe.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr
     
  • The typecasting of SPI base address to davinci_spi_reg is
    unused.

    Remove it.

    Tested-By: Michael Williamson
    Tested-By: Brian Niebuhr
    Signed-off-by: Sekhar Nori

    Sekhar Nori
     
  • Remove unused defines from code which should help
    in easy reading of code.

    Also, use the opportuinity to keep the SPIGCR1
    register defines together.

    Tested-By: Michael Williamson
    Tested-By: Brian Niebuhr
    Signed-off-by: Sekhar Nori

    Sekhar Nori
     
  • The 'pdata' variable is unused in couple of routines.

    Remove such occurences.

    Signed-off-by: Brian Niebuhr
    Tested-By: Michael Williamson
    Signed-off-by: Sekhar Nori

    Brian Niebuhr