| Index: arch/arm/mach-tegra/nv/include/nvrm_spi.h
|
| diff --git a/arch/arm/mach-tegra/nv/include/nvrm_spi.h b/arch/arm/mach-tegra/nv/include/nvrm_spi.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e5bee1e1bd1cc465b109c47b6f002df7ca83157d
|
| --- /dev/null
|
| +++ b/arch/arm/mach-tegra/nv/include/nvrm_spi.h
|
| @@ -0,0 +1,370 @@
|
| +/*
|
| + * Copyright (c) 2009 NVIDIA Corporation.
|
| + * All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions are met:
|
| + *
|
| + * Redistributions of source code must retain the above copyright notice,
|
| + * this list of conditions and the following disclaimer.
|
| + *
|
| + * Redistributions in binary form must reproduce the above copyright notice,
|
| + * this list of conditions and the following disclaimer in the documentation
|
| + * and/or other materials provided with the distribution.
|
| + *
|
| + * Neither the name of the NVIDIA Corporation nor the names of its contributors
|
| + * may be used to endorse or promote products derived from this software
|
| + * without specific prior written permission.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
| + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
| + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
| + * POSSIBILITY OF SUCH DAMAGE.
|
| + *
|
| + */
|
| +
|
| +#ifndef INCLUDED_nvrm_spi_H
|
| +#define INCLUDED_nvrm_spi_H
|
| +
|
| +
|
| +#if defined(__cplusplus)
|
| +extern "C"
|
| +{
|
| +#endif
|
| +
|
| +#include "nvrm_pinmux.h"
|
| +#include "nvrm_module.h"
|
| +#include "nvrm_init.h"
|
| +
|
| +#include "nvcommon.h"
|
| +
|
| +/**
|
| + * NvRmSpiHandle is an opaque context to the NvRmSpiRec interface.
|
| + */
|
| +
|
| +typedef struct NvRmSpiRec *NvRmSpiHandle;
|
| +
|
| +/**
|
| + * Open the handle for the spi/sflash controller. This api initalise the
|
| + * sflash/spi controller.
|
| + * The Instance Id for the sflash and spi controller start from 0.
|
| + * The handle for the spi/sflash is open in master and slave mode based on the
|
| + * parameter passed. If the spi handle is opened in master mode the the SPICLK
|
| + * is generated from the spi controller and it acts like a master for all the
|
| + * transaction.
|
| + *
|
| + * If the spi handle is opened in master mode then the controller can be shared
|
| + * between different chip select client but if the spi handle is created in the
|
| + * slave mode then it can not be shared by other client and only one client is
|
| + * allowed to open the spi handle for the slave mode.
|
| + *
|
| + * Assert encountered in debug mode if invalid parameter passed.
|
| + *
|
| + * @param hRmDevice Handle to the Rm device.
|
| + * @param IoModule The Rm IO module to set whether this is the
|
| + * NvOdmIoModule_Sflash or NvOdmIoModule_Slink or NvOdmIoModule_Spi.
|
| + * @param InstanceId The Instance Id which starts from the 0.
|
| + * @param IsMasterMode Tells whether the controller will be open in master mode
|
| + * or the slave mode?
|
| + * @param phRmSpi Pointer to the sflash/spi handle where the allocated handle
|
| + * will be stored.
|
| + *
|
| + * @retval NvSuccess Indicates the function is successfully completed
|
| + * @retval NvError_MemoryMappingFail Indicates the address mapping of the
|
| + * register failed.
|
| + * @retval NvError_InsufficientMemory Indicates that memory allocation is
|
| + * failed.
|
| + * @retval NvError_NotSupported Indicases that the spi is not supported.
|
| + * @retval NvError_AlreadyAllocated Indicases that the spi handle is already
|
| + * allocated to the other slave client.
|
| + */
|
| +
|
| + NvError NvRmSpiOpen(
|
| + NvRmDeviceHandle hRmDevice,
|
| + NvU32 IoModule,
|
| + NvU32 InstanceId,
|
| + NvBool IsMasterMode,
|
| + NvRmSpiHandle * phRmSpi );
|
| +
|
| +/**
|
| + * Deinitialize the spi controller, disable the clock and release the spi
|
| + * handle.
|
| + *
|
| + * @param hRmSpi A handle from NvRmSpiOpen(). If hRmSpi is NULL, this API does
|
| + * nothing.
|
| + */
|
| +
|
| + void NvRmSpiClose(
|
| + NvRmSpiHandle hRmSpi );
|
| +
|
| +/**
|
| + * Performs an Spi controller read and write simultaneously in master mode.
|
| + * This apis is only supported if the handle is open in master mode.
|
| + *
|
| + * Every Spi transaction is by definition a simultaneous read and write transaction, so
|
| + * there are no separate APIs for read versus write. However, if you only need
|
| + * to do a read or write, this API allows you to declare that you are not
|
| + * interested in the read data, or that the write data is not of interest.
|
| + * If only read is required then client can pass the NULL pointer to the
|
| + * pWriteBuffer. Zeros will be sent in this case.
|
| + * Similarly, if client wants to send data only then he can pass the
|
| + * pReadBuffer as NULL.
|
| + * If Read and write is required and he wants to first send the command and
|
| + * then want to read the response, then he need to send both the valid pointer
|
| + * read and write. In this case the bytesRequested will be the sum of the
|
| + * send command size and response size. The size of the pReadBuffer and
|
| + * pWriteBuffer should be equal to the bytes requetsed.
|
| + * E.g. Client want to send the 4byte command first and the wants to read the
|
| + * 4 byte response, then he need a 8 byte pWriteBuffer and 8 byte pReadBuffer.
|
| + * He will fill the first 4 byte of pWriteBuffer with the command which he
|
| + * wants to send. After calling this api, he needs to ignore the first 4 bytes
|
| + * and use the next 4 byte as valid response data in the pReadBuffer.
|
| + *
|
| + * This is a blocking API. It will returns when all the data has been transferred
|
| + * over the pins of the SOC (the transaction).
|
| + *
|
| + * Several Spi transactions may be performed in a single call to this API, but
|
| + * only if all of the transactions are to the same chip select and have the same
|
| + * packet size.
|
| + *
|
| + * Transaction sizes from 1 to 32 bits are supported. However, all of the
|
| + * packets are byte-aligned in memory. Like, if packetBitLength is 12 bit
|
| + * then client needs the 2 byte for the 1 packet. New packets start from the
|
| + * new bytes e.g. byte0 and byte1 contain the first packet and byte2 and byte3
|
| + * will contain the second packets.
|
| + *
|
| + * To perform one transaction, the BytesRequested argument should be:
|
| + *
|
| + * (PacketSizeInBits + 7)/8
|
| + *
|
| + * To perform n transactions, BytesRequested should be:
|
| + *
|
| + * n*((PacketSizeInBits + 7)/8)
|
| + *
|
| + * Within a given
|
| + * transaction with the packet size larger than 8 bits, the bytes are stored in
|
| + * order of the MSB (most significant byte) first.
|
| + * The Packet is formed with the first Byte will be in MSB and then next byte
|
| + * will be in the next MSB towards the LSB.
|
| + *
|
| + * For the example, if One packet need to be send and its size is the 20 bit
|
| + * then it will require the 3 bytes in the pWriteBuffer and arrangement of the
|
| + * data are as follows:
|
| + * The packet is 0x000ABCDE (Packet with length of 20 bit).
|
| + * pWriteBuff[0] = 0x0A
|
| + * pWriteBuff[1] = 0xBC
|
| + * pWtriteBuff[2] = 0xDE
|
| + *
|
| + * The most significant bit will be transmitted first i.e. bit20 is transmitted
|
| + * first and bit 0 will be transmitted last.
|
| + *
|
| + * If the transmitted packet (command + receive data) is more than 32 like 33 and
|
| + * want to transfer in the single call (CS should be active) then it can be transmitted
|
| + * in following way:
|
| + * The transfer is command(8 bit)+Dummy(1bit)+Read (24 bit) = 33 bit of transfer.
|
| + * - Send 33 bit as 33 byte and each byte have the 1 valid bit, So packet bit length = 1 and
|
| + * bytes requested = 33.
|
| + * NvU8 pSendData[33], pRecData[33];
|
| + * pSendData[0] = (Comamnd >>7) & 0x1;
|
| + * pSendData[1] = (Command >> 6)& 0x1;
|
| + * ::::::::::::::
|
| + * pSendData[8] = DummyBit;
|
| + * pSendData[9] to pSendData[32] = 0;
|
| + * Call NvRmSpiTransaction(hRmSpi,SpiPinMap,ChipSelect,ClockSpeedInKHz,pRecData, pSendData, 33,1);
|
| + * Now You will get the read data from pRecData[9] to pRecData[32] on bit 0 on each byte.
|
| + *
|
| + * - The 33 bit transfer can be also done as 11 byte and each byte have the 3 valid bits.
|
| + * This need to rearrange the command in the pSendData in such a way that each byte have the
|
| + * 3 valid bits.
|
| + * NvU8 pSendData[11], pRecData[11];
|
| + * pSendData[0] = (Comamnd >>4) & 0x7;
|
| + * pSendData[1] = (Command >> 1)& 0x7;
|
| + * pSendData[2] = (((Command)& 0x3) <<1) | DummyBit;
|
| + * pSendData[3] to pSendData[10] = 0;
|
| + *
|
| + * Call NvRmSpiTransaction(hRmSpi,SpiPinMap,ChipSelect,ClockSpeedInKHz,pRecData, pSendData, 11,3);
|
| + * Now You will get the read data from pRecData[4] to pRecData[10] on lower 3 bits on each byte.
|
| + *
|
| + * Similarly the 33 bit transfer can also be done as 6 byte and each 2 bytes contain the 11 valid bits.
|
| + * Call NvRmSpiTransaction(hRmSpi,SpiPinMap,ChipSelect,ClockSpeedInKHz,pRecData, pSendData, 6,11);
|
| + *
|
| + * pReadBuffer and pWriteBuffer may be the same pointer, in which case the
|
| + * write data is destroyed as we read in the read data. Unless they are
|
| + * identical pointers, however, pReadBuffer and pWriteBuffer must not overlap.
|
| + *
|
| + * @param hOdmSpi The Spi handle allocated in a call to NvOdmSpiOpen().
|
| + * @param SpiPinMap For SPI master-mode controllers which are being multiplexed across
|
| + * multiple pin mux configurations, this specifies which pin mux configuration
|
| + * should be used for the transaction. Must be 0 when the ODM pin mux query
|
| + * specifies a non-multiplexed configuration for the controller.
|
| + * @param ChipSelectId The chip select Id on which device is connected.
|
| + * @param ClockSpeedInKHz The clock speed in KHz on which device can communicate.
|
| + * @param pReadBuffer A pointer to buffer to be filled in with read data. If this
|
| + * pointer is NULL, the read data will be discarded.
|
| + * @param pWriteBuffer A pointer to a buffer from which to obtain write data. If this
|
| + * pointer is NULL, the write data will be all zeros.
|
| + * @param BytesRequested The size of pReadBuffer and pWriteBuffer buffers in bytes.
|
| + * @param PacketSizeInBits The packet size in bits of each Spi transaction.
|
| + *
|
| + */
|
| +
|
| + void NvRmSpiTransaction(
|
| + NvRmSpiHandle hRmSpi,
|
| + NvU32 SpiPinMap,
|
| + NvU32 ChipSelectId,
|
| + NvU32 ClockSpeedInKHz,
|
| + NvU8 * pReadBuffer,
|
| + NvU8 * pWriteBuffer,
|
| + NvU32 BytesRequested,
|
| + NvU32 PacketSizeInBits );
|
| +
|
| +/**
|
| + * Start an Spi controller read and write simultaneously in the slave mode.
|
| + * This API is only supported for the spi handle which is opened in slave mode.
|
| + *
|
| + * This API will assert if opened spi handle is the master type.
|
| + *
|
| + * Every Spi transaction is by definition a simultaneous read and write
|
| + * transaction, so there are no separate APIs for read versus write.
|
| + * However, if you only need to start a read or write transaction, this API
|
| + * allows you to declare that you are not interested in the read data,
|
| + * or that the write data is not of interest.
|
| + * If only read is required to start then client can pass NV_TRUE to the the
|
| + * IsReadTransfer and NULL pointer to the pWriteBuffer. The state of the dataout
|
| + * will be set by IsIdleDataOutHigh of the structure NvOdmQuerySpiIdleSignalState
|
| + * in nvodm_query.h.
|
| + * Similarly, if client wants to send data only then he can pass NV_FALSE to the
|
| + * IsReadTransfer.
|
| + *
|
| + * This is a nonblocking API. This api start the data transfer and returns to the
|
| + * caller without waiting for the data transfer completion.
|
| + *
|
| + * Transaction sizes from 1 to 32 bits are supported. However, all of the
|
| + * packets are byte-aligned in memory. Like, if packetBitLength is 12 bit
|
| + * then client needs the 2 byte for the 1 packet. New packets start from the
|
| + * new bytes e.g. byte0 and byte1 contain the first packet and byte2 and byte3
|
| + * will contain the second packets.
|
| + *
|
| + * To perform one transaction, the BytesRequested argument should be:
|
| + *
|
| + * (PacketSizeInBits + 7)/8
|
| + *
|
| + * To perform n transactions, BytesRequested should be:
|
| + *
|
| + * n*((PacketSizeInBits + 7)/8)
|
| + *
|
| + * Within a given
|
| + * transaction with the packet size larger than 8 bits, the bytes are stored in
|
| + * order of the LSB (least significant byte) first.
|
| + * The Packet is formed with the first Byte will be in LSB and then next byte
|
| + * will be in the next LSB towards the MSB.
|
| + *
|
| + * For the example, if One packet need to be send and its size is the 20 bit
|
| + * then it will require the 3 bytes in the pWriteBuffer and arrangement of the
|
| + * data are as follows:
|
| + * The packet is 0x000ABCDE (Packet with length of 20 bit).
|
| + * pWriteBuff[0] = 0xDE
|
| + * pWriteBuff[1] = 0xBC
|
| + * pWtriteBuff[2] = 0x0A
|
| + *
|
| + * The most significant bit will be transmitted first i.e. bit20 is transmitted
|
| + * first and bit 0 will be transmitted last.
|
| + *
|
| + * @see NvRmSpiGetTransactionData
|
| + * Typical usecase for the CAIF interface. The step for doing the transfer is:
|
| + * 1. ACPU calls the NvRmSpiStartTransaction() to configure the spi controller
|
| + * to set in the receive or transmit mode and make ready for the data transfer.
|
| + * 2. ACPU then send the signal to the CCPU to send the SPICLK (by activating
|
| + * the SPI_INT) and start the transaction. CCPU get this signal and start sending
|
| + * SPICLK.
|
| + * 3. ACPU will call the NvRmSpiGetTransactionData() to get the data/information
|
| + * about the transaction.
|
| + * 4. After completion of the transfer ACPU inactivate the SPI_INT.
|
| + *
|
| + * @param hOdmSpi The Spi handle allocated in a call to NvOdmSpiOpen().
|
| + * @param ChipSelectId The chip select Id on which device is connected.
|
| + * @param ClockSpeedInKHz The clock speed in KHz on which device can communicate.
|
| + * @param IsReadTransfer It tells that whether the read transfer is required or
|
| + * not. If it is NV_TRUE then read transfer is required and the read data will be
|
| + * available in the local buffer of the driver. The client will get the received
|
| + * data after calling the NvRmSpiGetTransactionData().
|
| + * @param pWriteBuffer A pointer to a buffer from which to obtain write data. If this
|
| + * pointer is NULL, the write data will be all zeros.
|
| + * @param BytesRequested The size of pReadBuffer and pWriteBuffer buffers in bytes.
|
| + * @param PacketSizeInBits The packet size in bits of each Spi transaction.
|
| + *
|
| + */
|
| +
|
| + NvError NvRmSpiStartTransaction(
|
| + NvRmSpiHandle hRmSpi,
|
| + NvU32 ChipSelectId,
|
| + NvU32 ClockSpeedInKHz,
|
| + NvBool IsReadTransfer,
|
| + NvU8 * pWriteBuffer,
|
| + NvU32 BytesRequested,
|
| + NvU32 PacketSizeInBits );
|
| +
|
| +/**
|
| + * Get the spi transaction status that is started for the slave mode and wait
|
| + * if required till the transfer completes for a given timeout error.
|
| + * If read transaction has been started then it will return the receive data to
|
| + * the client.
|
| + *
|
| + * This is a blocking API and wait for the data transfer completion till the
|
| + * data requested transfer completes or the timeout happen.
|
| + *
|
| + * @see NvRmSpiStartTransaction
|
| + *
|
| + * @param hOdmSpi The Spi handle allocated in a call to NvOdmSpiOpen().
|
| + * @param pReadBuffer A pointer to buffer to be filled in with read data. If this
|
| + * pointer is NULL, the read data will be discarded.
|
| + * @param BytesRequested The size of pReadBuffer and pWriteBuffer buffers in bytes.
|
| + * @param BytesTransfererd The number of bytes transferred.
|
| + * @param WaitTimeout The timeout in millisecond to wait for the trsnaction to be
|
| + * completed.
|
| + *
|
| + * @retval NvSuccess Indicates that the operation succeeded.
|
| + * @retval NvError_Timeout Indicates that the timeout happen.
|
| + * @retval NvError_InvalidState Indicates that the transfer has not been started.
|
| + *
|
| + */
|
| +
|
| + NvError NvRmSpiGetTransactionData(
|
| + NvRmSpiHandle hRmSpi,
|
| + NvU8 * pReadBuffer,
|
| + NvU32 BytesRequested,
|
| + NvU32 * pBytesTransfererd,
|
| + NvU32 WaitTimeout );
|
| +
|
| +/**
|
| + * Set the signal mode for the spi communication for a given chip select.
|
| + * After calling this API, the further communication happen with the new
|
| + * configured signal modes.
|
| + * The default value of the signal mode is taken from nvodm query and this
|
| + * api will override the signal mode which is read from query.
|
| + *
|
| + * @see NvRmSpiStartTransaction
|
| + *
|
| + * @param hOdmSpi The Spi handle allocated in a call to NvOdmSpiOpen().
|
| + * @param ChipSelectId The chip select Id on which device is connected.
|
| + * @param SpiSignalMode The nvodm signal modes which need to be set.
|
| + *
|
| + */
|
| +
|
| + void NvRmSpiSetSignalMode(
|
| + NvRmSpiHandle hRmSpi,
|
| + NvU32 ChipSelectId,
|
| + NvU32 SpiSignalMode );
|
| +
|
| +#if defined(__cplusplus)
|
| +}
|
| +#endif
|
| +
|
| +#endif
|
|
|