All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick Dickey <pdickeybeta@gmail.com>
To: linux-media@vger.kernel.org
Cc: Patrick Dickey <pdickeybeta@gmail.com>
Subject: [PATCH 09/25] added drx_dap_fasi for pctv80e support
Date: Thu, 10 Nov 2011 17:31:29 -0600	[thread overview]
Message-ID: <1320967905-7932-10-git-send-email-pdickeybeta@gmail.com> (raw)
In-Reply-To: <1320967905-7932-1-git-send-email-pdickeybeta@gmail.com>

---
 drivers/media/dvb/frontends/drx_dap_fasi.c |  670 ++++++++++++++++++++++++++++
 1 files changed, 670 insertions(+), 0 deletions(-)
 create mode 100644 drivers/media/dvb/frontends/drx_dap_fasi.c

diff --git a/drivers/media/dvb/frontends/drx_dap_fasi.c b/drivers/media/dvb/frontends/drx_dap_fasi.c
new file mode 100644
index 0000000..f34641d
--- /dev/null
+++ b/drivers/media/dvb/frontends/drx_dap_fasi.c
@@ -0,0 +1,670 @@
+/*
+  Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
+  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 Trident Microsystems nor Hauppauge Computer Works
+    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.
+*/
+
+/*******************************************************************************
+* FILENAME: $Id: drx_dap_fasi.c,v 1.7 2009/12/28 14:36:21 carlo Exp $
+*
+* DESCRIPTION:
+* Part of DRX driver.
+* Data access protocol: Fast Access Sequential Interface (fasi)
+* Fast access, because of short addressing format (16 instead of 32 bits addr)
+* Sequential, because of I2C.
+* These functions know how the chip's memory and registers are to be accessed,
+* but nothing more.
+*
+* These functions should not need adapting to a new platform.
+*
+* USAGE:
+* -
+*
+* NOTES:
+*
+*
+*******************************************************************************/
+
+#include "drx_dap_fasi.h"
+#include "bsp_host.h"  /* for DRXBSP_HST_Memcpy() */
+
+/*============================================================================*/
+
+/* Function prototypes */
+static DRXStatus_t DRXDAP_FASI_WriteBlock (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register/memory   */
+	u16_t             datasize,      /* size of data                 */
+	pu8_t             data,          /* data to send                 */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadBlock (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register/memory   */
+	u16_t             datasize,      /* size of data                 */
+	pu8_t             data,          /* data to send                 */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_WriteReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	u8_t              data,          /* data to write                */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	pu8_t             data,          /* buffer to receive data       */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         waddr,         /* address of register          */
+	DRXaddr_t         raddr,         /* address to read back from    */
+	u8_t              datain,        /* data to send                 */
+	pu8_t             dataout);      /* data to receive back         */
+
+static DRXStatus_t DRXDAP_FASI_WriteReg16 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	u16_t             data,          /* data to write                */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadReg16 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	pu16_t            data,          /* buffer to receive data       */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg16 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         waddr,         /* address of register          */
+	DRXaddr_t         raddr,         /* address to read back from    */
+	u16_t             datain,        /* data to send                 */
+	pu16_t            dataout);      /* data to receive back         */
+
+static DRXStatus_t DRXDAP_FASI_WriteReg32 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	u32_t             data,          /* data to write                */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadReg32 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	pu32_t            data,          /* buffer to receive data       */
+	DRXflags_t        flags);        /* special device flags         */
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg32 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         waddr,         /* address of register          */
+	DRXaddr_t         raddr,         /* address to read back from    */
+	u32_t             datain,        /* data to send                 */
+	pu32_t            dataout);      /* data to receive back         */
+
+/* The version structure of this protocol implementation */
+char drxDapFASIModuleName[]  = "FASI Data Access Protocol";
+char drxDapFASIVersionText[] = "";
+
+DRXVersion_t drxDapFASIVersion =
+{
+	DRX_MODULE_DAP,            /**< type identifier of the module */
+	drxDapFASIModuleName,      /**< name or description of module */
+
+	0,                         /**< major version number */
+	0,                         /**< minor version number */
+	0,                         /**< patch version number */
+	drxDapFASIVersionText      /**< version as text string */
+};
+
+/* The structure containing the protocol interface */
+DRXAccessFunc_t drxDapFASIFunct_g =
+{
+	&drxDapFASIVersion,
+	DRXDAP_FASI_WriteBlock,               /* Supported */
+	DRXDAP_FASI_ReadBlock,                /* Supported */
+	DRXDAP_FASI_WriteReg8,                /* Not supported */
+	DRXDAP_FASI_ReadReg8,                 /* Not supported */
+	DRXDAP_FASI_ReadModifyWriteReg8,      /* Not supported */
+	DRXDAP_FASI_WriteReg16,               /* Supported */
+	DRXDAP_FASI_ReadReg16,                /* Supported */
+	DRXDAP_FASI_ReadModifyWriteReg16,     /* Supported */
+	DRXDAP_FASI_WriteReg32,               /* Supported */
+	DRXDAP_FASI_ReadReg32,                /* Supported */
+	DRXDAP_FASI_ReadModifyWriteReg32      /* Not supported */
+};
+
+/*============================================================================*/
+
+/* Functions not supported by protocol*/
+
+static DRXStatus_t DRXDAP_FASI_WriteReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	u8_t              data,          /* data to write                */
+	DRXflags_t        flags)         /* special device flags         */
+{
+	return DRX_STS_ERROR;
+}
+
+static DRXStatus_t DRXDAP_FASI_ReadReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         addr,          /* address of register          */
+	pu8_t             data,          /* buffer to receive data       */
+	DRXflags_t        flags)         /* special device flags         */
+{
+	return DRX_STS_ERROR;
+}
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg8 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         waddr,         /* address of register          */
+	DRXaddr_t         raddr,         /* address to read back from    */
+	u8_t              datain,        /* data to send                 */
+	pu8_t             dataout)       /* data to receive back         */
+{
+	return DRX_STS_ERROR;
+}
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg32 (
+	pI2CDeviceAddr_t  devAddr,       /* address of I2C device        */
+	DRXaddr_t         waddr,         /* address of register          */
+	DRXaddr_t         raddr,         /* address to read back from    */
+	u32_t             datain,        /* data to send                 */
+	pu32_t            dataout)       /* data to receive back         */
+{
+	return DRX_STS_ERROR;
+}
+
+/*============================================================================*/
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_ReadBlock (
+*      pI2CDeviceAddr_t devAddr,      -- address of I2C device
+*      DRXaddr_t        addr,         -- address of chip register/memory
+*      u16_t            datasize,     -- number of bytes to read
+*      pu8_t            data,         -- data to receive
+*      DRXflags_t       flags)        -- special device flags
+*
+* Read block data from chip address. Because the chip is word oriented,
+* the number of bytes to read must be even.
+*
+* Make sure that the buffer to receive the data is large enough.
+*
+* Although this function expects an even number of bytes, it is still byte
+* oriented, and the data read back is NOT translated to the endianness of
+* the target platform.
+*
+* Output:
+* - DRX_STS_OK     if reading was successful
+*                  in that case: data read is in *data.
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_ReadBlock (pI2CDeviceAddr_t  devAddr,
+					DRXaddr_t         addr,
+					u16_t             datasize,
+					pu8_t             data,
+					DRXflags_t        flags)
+{
+	u8_t buf[4];
+	u16_t bufx;
+	DRXStatus_t rc;
+	u16_t overheadSize = 0;
+
+	/* Check parameters ********************************************************/
+	if (devAddr == NULL)
+	{
+	return DRX_STS_INVALID_ARG;
+	}
+
+	overheadSize = (IS_I2C_10BIT (devAddr->i2cAddr) ? 2 : 1) +
+			(DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
+
+	if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
+		((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
+		DRXDAP_FASI_LONG_FORMAT(addr)) ||
+		(overheadSize > (DRXDAP_MAX_WCHUNKSIZE)) ||
+		((datasize!=0) && (data==NULL)) ||
+		((datasize & 1)==1))
+	{
+	return DRX_STS_INVALID_ARG;
+	}
+
+	/* ReadModifyWrite & mode flag bits are not allowed */
+	flags &= (~DRXDAP_FASI_RMW & ~DRXDAP_FASI_MODEFLAGS);
+#if DRXDAP_SINGLE_MASTER
+	flags |= DRXDAP_FASI_SINGLE_MASTER;
+#endif
+
+	/* Read block from I2C *****************************************************/
+	do {
+		u16_t todo = (datasize <  DRXDAP_MAX_RCHUNKSIZE ?
+				datasize :  DRXDAP_MAX_RCHUNKSIZE);
+
+	bufx = 0;
+
+	addr  &= ~DRXDAP_FASI_FLAGS;
+	addr |= flags;
+
+#if ((DRXDAPFASI_LONG_ADDR_ALLOWED==1) && \
+	(DRXDAPFASI_SHORT_ADDR_ALLOWED==1))
+	/* short format address preferred but long format otherwise */
+	if (DRXDAP_FASI_LONG_FORMAT(addr))
+	{
+#endif
+#if (DRXDAPFASI_LONG_ADDR_ALLOWED==1)
+	buf[bufx++] = (u8_t) (((addr <<  1) & 0xFF)|0x01);
+	buf[bufx++] = (u8_t) ((addr >> 16) & 0xFF);
+	buf[bufx++] = (u8_t) ((addr >> 24) & 0xFF);
+	buf[bufx++] = (u8_t) ((addr >>  7) & 0xFF);
+#endif
+#if ((DRXDAPFASI_LONG_ADDR_ALLOWED==1) && \
+	(DRXDAPFASI_SHORT_ADDR_ALLOWED==1))
+	} else {
+#endif
+#if (DRXDAPFASI_SHORT_ADDR_ALLOWED==1)
+	buf[bufx++] = (u8_t) ((addr <<  1) & 0xFF);
+	buf[bufx++] = (u8_t) (((addr >> 16) & 0x0F) | ((addr >> 18) & 0xF0));
+#endif
+#if ((DRXDAPFASI_LONG_ADDR_ALLOWED==1) && \
+	(DRXDAPFASI_SHORT_ADDR_ALLOWED==1))
+	}
+#endif
+
+
+
+
+#if DRXDAP_SINGLE_MASTER
+	/*
+	* In single master mode, split the read and write actions.
+	* No special action is needed for write chunks here.
+	*/
+	rc = DRXBSP_I2C_WriteRead (devAddr, bufx, buf, 0, 0, 0);
+	if (rc == DRX_STS_OK) {
+		rc = DRXBSP_I2C_WriteRead (0, 0, 0, devAddr, todo, data);
+	}
+#else
+	/* In multi master mode, do everything in one RW action */
+	rc = DRXBSP_I2C_WriteRead (devAddr, bufx, buf, devAddr, todo, data);
+#endif
+	data += todo;
+	addr += (todo >> 1);
+	datasize -= todo;
+	} while (datasize && rc == DRX_STS_OK);
+
+	return rc;
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg16 (
+*      pI2CDeviceAddr_t devAddr,   -- address of I2C device
+*      DRXaddr_t        waddr,     -- address of chip register/memory
+*      DRXaddr_t        raddr,     -- chip address to read back from
+*      u16_t            wdata,     -- data to send
+*      pu16_t           rdata)     -- data to receive back
+*
+* Write 16-bit data, then read back the original contents of that location.
+* Requires long addressing format to be allowed.
+*
+* Before sending data, the data is converted to little endian. The
+* data received back is converted back to the target platform's endianness.
+*
+* WARNING: This function is only guaranteed to work if there is one
+* master on the I2C bus.
+*
+* Output:
+* - DRX_STS_OK     if reading was successful
+*                  in that case: read back data is at *rdata
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_ReadModifyWriteReg16 (pI2CDeviceAddr_t  devAddr,
+						DRXaddr_t         waddr,
+						DRXaddr_t         raddr,
+						u16_t             wdata,
+						pu16_t            rdata)
+{
+	DRXStatus_t rc=DRX_STS_ERROR;
+
+#if (DRXDAPFASI_LONG_ADDR_ALLOWED==1)
+	if (rdata == NULL) {
+		return DRX_STS_INVALID_ARG;
+	}
+
+	rc = DRXDAP_FASI_WriteReg16 (devAddr, waddr, wdata, DRXDAP_FASI_RMW);
+	if (rc == DRX_STS_OK) {
+		rc = DRXDAP_FASI_ReadReg16 (devAddr, raddr, rdata, 0);
+	}
+#endif
+
+	return rc;
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_ReadReg16 (
+*     pI2CDeviceAddr_t devAddr, -- address of I2C device
+*     DRXaddr_t        addr,    -- address of chip register/memory
+*     pu16_t           data,    -- data to receive
+*     DRXflags_t       flags)   -- special device flags
+*
+* Read one 16-bit register or memory location. The data received back is
+* converted back to the target platform's endianness.
+*
+* Output:
+* - DRX_STS_OK     if reading was successful
+*                  in that case: read data is at *data
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_ReadReg16 (pI2CDeviceAddr_t  devAddr,
+					DRXaddr_t         addr,
+					pu16_t            data,
+					DRXflags_t        flags)
+{
+	u8_t buf[sizeof (*data)];
+	DRXStatus_t rc;
+
+	if (!data) {
+		return DRX_STS_INVALID_ARG;
+	}
+	rc = DRXDAP_FASI_ReadBlock (devAddr, addr, sizeof (*data), buf, flags);
+	*data = buf[0] + (((u16_t) buf[1]) << 8);
+	return rc;
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_ReadReg32 (
+*     pI2CDeviceAddr_t devAddr, -- address of I2C device
+*     DRXaddr_t        addr,    -- address of chip register/memory
+*     pu32_t           data,    -- data to receive
+*     DRXflags_t       flags)   -- special device flags
+*
+* Read one 32-bit register or memory location. The data received back is
+* converted back to the target platform's endianness.
+*
+* Output:
+* - DRX_STS_OK     if reading was successful
+*                  in that case: read data is at *data
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_ReadReg32 (pI2CDeviceAddr_t  devAddr,
+					DRXaddr_t         addr,
+					pu32_t            data,
+					DRXflags_t        flags)
+{
+	u8_t buf[sizeof (*data)];
+	DRXStatus_t rc;
+
+	if (!data) {
+		return DRX_STS_INVALID_ARG;
+	}
+	rc = DRXDAP_FASI_ReadBlock (devAddr, addr, sizeof (*data), buf, flags);
+	*data =  (((u32_t) buf[0]) <<  0) +
+		(((u32_t) buf[1]) <<  8) +
+		(((u32_t) buf[2]) << 16) +
+		(((u32_t) buf[3]) << 24);
+	return rc;
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_WriteBlock (
+*      pI2CDeviceAddr_t devAddr,    -- address of I2C device
+*      DRXaddr_t        addr,       -- address of chip register/memory
+*      u16_t            datasize,   -- number of bytes to read
+*      pu8_t            data,       -- data to receive
+*      DRXflags_t       flags)      -- special device flags
+*
+* Write block data to chip address. Because the chip is word oriented,
+* the number of bytes to write must be even.
+*
+* Although this function expects an even number of bytes, it is still byte
+* oriented, and the data being written is NOT translated from the endianness of
+* the target platform.
+*
+* Output:
+* - DRX_STS_OK     if writing was successful
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_WriteBlock (pI2CDeviceAddr_t  devAddr,
+						DRXaddr_t         addr,
+						u16_t             datasize,
+						pu8_t             data,
+						DRXflags_t        flags)
+{
+	u8_t buf[ DRXDAP_MAX_WCHUNKSIZE ];
+	DRXStatus_t st       = DRX_STS_ERROR;
+	DRXStatus_t firstErr = DRX_STS_OK;
+	u16_t overheadSize   = 0;
+	u16_t blockSize      = 0;
+
+   /* Check parameters ********************************************************/
+	if (devAddr == NULL) {
+		return DRX_STS_INVALID_ARG;
+	}
+
+	overheadSize = (IS_I2C_10BIT (devAddr->i2cAddr) ? 2 : 1) +
+			(DRXDAP_FASI_LONG_FORMAT(addr) ? 4 : 2);
+
+	if ((DRXDAP_FASI_OFFSET_TOO_LARGE(addr)) ||
+		((!(DRXDAPFASI_LONG_ADDR_ALLOWED)) &&
+		DRXDAP_FASI_LONG_FORMAT(addr)) ||
+		(overheadSize > (DRXDAP_MAX_WCHUNKSIZE)) ||
+		((datasize!=0) && (data==NULL)) ||
+		((datasize & 1)==1)) {
+		return DRX_STS_INVALID_ARG;
+	}
+
+	flags &= DRXDAP_FASI_FLAGS;
+	flags &= ~DRXDAP_FASI_MODEFLAGS;
+#if DRXDAP_SINGLE_MASTER
+	flags |= DRXDAP_FASI_SINGLE_MASTER;
+#endif
+
+   /* Write block to I2C ******************************************************/
+	blockSize = ((DRXDAP_MAX_WCHUNKSIZE) - overheadSize) & ~1;
+	do
+	{
+		u16_t todo = 0;
+		u16_t bufx = 0;
+
+		/* Buffer device address */
+		addr  &= ~DRXDAP_FASI_FLAGS;
+		addr |= flags;
+		#if (((DRXDAPFASI_LONG_ADDR_ALLOWED)==1) && \
+			((DRXDAPFASI_SHORT_ADDR_ALLOWED)==1))
+			/* short format address preferred but long format otherwise */
+			if (DRXDAP_FASI_LONG_FORMAT(addr)) {
+		#endif
+		#if ((DRXDAPFASI_LONG_ADDR_ALLOWED)==1)
+			buf[bufx++] = (u8_t) (((addr <<  1) & 0xFF)|0x01);
+			buf[bufx++] = (u8_t) ((addr >> 16) & 0xFF);
+			buf[bufx++] = (u8_t) ((addr >> 24) & 0xFF);
+			buf[bufx++] = (u8_t) ((addr >>  7) & 0xFF);
+		#endif
+		#if (((DRXDAPFASI_LONG_ADDR_ALLOWED)==1) && \
+			((DRXDAPFASI_SHORT_ADDR_ALLOWED)==1))
+		} else {
+		#endif
+			#if ((DRXDAPFASI_SHORT_ADDR_ALLOWED)==1)
+			buf[bufx++] = (u8_t) ((addr <<  1) & 0xFF);
+			buf[bufx++] = (u8_t) (((addr >> 16) & 0x0F) |
+						((addr >> 18) & 0xF0));
+			#endif
+			#if (((DRXDAPFASI_LONG_ADDR_ALLOWED)==1) && \
+				((DRXDAPFASI_SHORT_ADDR_ALLOWED)==1))
+		}
+			#endif
+
+		/*
+		In single master mode blockSize can be 0. In such a case this I2C
+		sequense will be visible: (1) write address {i2c addr,
+		4 bytes chip address} (2) write data {i2c addr, 4 bytes data }
+		(3) write address (4) write data etc...
+		Addres must be rewriten because HI is reset after data transport and
+		expects an address.
+		*/
+		todo = (blockSize < datasize ? blockSize : datasize);
+		if (todo==0) {
+			u16_t overheadSizeI2cAddr = 0;
+			u16_t dataBlockSize       = 0;
+
+			overheadSizeI2cAddr = (IS_I2C_10BIT (devAddr->i2cAddr)
+						 ? 2 : 1);
+			dataBlockSize = (DRXDAP_MAX_WCHUNKSIZE -
+					overheadSizeI2cAddr) & ~1;
+
+			/* write device address */
+			st = DRXBSP_I2C_WriteRead(devAddr,
+						(u16_t) (bufx),
+						buf,
+						(pI2CDeviceAddr_t)(NULL),
+						0,
+						(pu8_t)(NULL));
+
+			if ((st != DRX_STS_OK) && (firstErr == DRX_STS_OK)) {
+				/* at the end, return the first error encountered */
+				firstErr = st;
+			}
+			bufx = 0;
+			todo = (dataBlockSize < datasize ? dataBlockSize :
+								datasize);
+		}
+		DRXBSP_HST_Memcpy (&buf[bufx], data, todo);
+		/* write (address if can do and) data */
+		st = DRXBSP_I2C_WriteRead(devAddr,
+						(u16_t)(bufx + todo),
+						buf,
+						(pI2CDeviceAddr_t)(NULL),
+						0,
+						(pu8_t)(NULL));
+
+		if ((st != DRX_STS_OK) && (firstErr == DRX_STS_OK)) {
+			/* at the end, return the first error encountered */
+			firstErr = st;
+		}
+		datasize -= todo;
+		data += todo;
+		addr += (todo >> 1);
+	} while (datasize);
+
+	return firstErr;
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_WriteReg16 (
+*     pI2CDeviceAddr_t devAddr, -- address of I2C device
+*     DRXaddr_t        addr,    -- address of chip register/memory
+*     u16_t            data,    -- data to send
+*     DRXflags_t       flags)   -- special device flags
+*
+* Write one 16-bit register or memory location. The data being written is
+* converted from the target platform's endianness to little endian.
+*
+* Output:
+* - DRX_STS_OK     if writing was successful
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_WriteReg16 (pI2CDeviceAddr_t  devAddr,
+					DRXaddr_t         addr,
+					u16_t             data,
+					DRXflags_t        flags)
+{
+	u8_t buf[sizeof (data)];
+
+	buf[0] = (u8_t) ((data >> 0) & 0xFF);
+	buf[1] = (u8_t) ((data >> 8) & 0xFF);
+
+	return DRXDAP_FASI_WriteBlock (devAddr, addr, sizeof (data), buf,
+								flags);
+}
+
+
+
+
+/******************************
+*
+* DRXStatus_t DRXDAP_FASI_WriteReg32 (
+*     pI2CDeviceAddr_t devAddr, -- address of I2C device
+*     DRXaddr_t        addr,    -- address of chip register/memory
+*     u32_t            data,    -- data to send
+*     DRXflags_t       flags)   -- special device flags
+*
+* Write one 32-bit register or memory location. The data being written is
+* converted from the target platform's endianness to little endian.
+*
+* Output:
+* - DRX_STS_OK     if writing was successful
+* - DRX_STS_ERROR  if anything went wrong
+*
+******************************/
+
+static DRXStatus_t DRXDAP_FASI_WriteReg32 (pI2CDeviceAddr_t  devAddr,
+					DRXaddr_t         addr,
+					u32_t             data,
+					DRXflags_t        flags)
+{
+	u8_t buf[sizeof (data)];
+
+	buf[0] = (u8_t) ((data >> 0) & 0xFF);
+	buf[1] = (u8_t) ((data >> 8) & 0xFF);
+	buf[2] = (u8_t) ((data >> 16) & 0xFF);
+	buf[3] = (u8_t) ((data >> 24) & 0xFF);
+
+	return DRXDAP_FASI_WriteBlock (devAddr, addr, sizeof (data), buf,
+								flags);
+}
-- 
1.7.5.4


  parent reply	other threads:[~2011-11-10 23:34 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-10 23:31 [PATCH 00/25] Add PCTV-80e Support to v4l Patrick Dickey
2011-11-10 23:31 ` [PATCH 01/25] added PCTV80e information to cardlist file Patrick Dickey
2011-11-10 23:31 ` [PATCH 02/25] added bsp_host for pctv80e support Patrick Dickey
2011-11-10 23:31 ` [PATCH 03/25] added bsp_i2c " Patrick Dickey
2011-11-10 23:31 ` [PATCH 04/25] added bsp_tuner " Patrick Dickey
2011-11-10 23:31 ` [PATCH 05/25] added bsp_types " Patrick Dickey
2011-11-10 23:31 ` [PATCH 06/25] added drx39xxj " Patrick Dickey
2011-11-10 23:31 ` [PATCH 07/25] added drx39xxj header " Patrick Dickey
2011-11-10 23:31 ` [PATCH 08/25] added drx39_dummy " Patrick Dickey
2011-11-10 23:31 ` Patrick Dickey [this message]
2011-11-10 23:31 ` [PATCH 10/25] added drx_dap_fasi header " Patrick Dickey
2011-11-10 23:31 ` [PATCH 11/25] added drx_driver " Patrick Dickey
2011-11-10 23:31 ` [PATCH 12/25] added drx_driver header " Patrick Dickey
2011-11-10 23:31 ` [PATCH 13/25] added drx_driver_version " Patrick Dickey
2011-11-10 23:31 ` [PATCH 15/25] added drxj " Patrick Dickey
2011-11-10 23:31 ` [PATCH 18/25] added drxj_mc_vsb " Patrick Dickey
2011-11-10 23:31 ` [PATCH 19/25] added drxj_mc_vsbqam " Patrick Dickey
2011-11-10 23:31 ` [PATCH 20/25] added drxj_options " Patrick Dickey
2011-11-10 23:31 ` [PATCH 21/25] modified Kconfig to include " Patrick Dickey
2011-11-10 23:31 ` [PATCH 22/25] modified Makefile for " Patrick Dickey
2011-11-10 23:31 ` [PATCH 23/25] modified em28xx-cards " Patrick Dickey
2011-11-10 23:31 ` [PATCH 24/25] modified em28xx-dvb " Patrick Dickey
2011-11-10 23:31 ` [PATCH 25/25] modified em28xx header " Patrick Dickey
2011-11-11  1:45 ` [PATCH 00/25] Add PCTV-80e Support to v4l Devin Heitmueller
2011-11-11  2:36   ` Patrick Dickey
2011-11-11  3:19     ` Devin Heitmueller
2011-11-11 11:39       ` Patrick Dickey
2011-11-11 13:28       ` Patrick Dickey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1320967905-7932-10-git-send-email-pdickeybeta@gmail.com \
    --to=pdickeybeta@gmail.com \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.