xref: /openbmc/linux/drivers/media/dvb-frontends/drx39xyj/drx_dap_fasi.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1ca3355a9SDevin Heitmueller /*
2ca3355a9SDevin Heitmueller   Copyright (c), 2004-2005,2007-2010 Trident Microsystems, Inc.
3ca3355a9SDevin Heitmueller   All rights reserved.
4ca3355a9SDevin Heitmueller 
5ca3355a9SDevin Heitmueller   Redistribution and use in source and binary forms, with or without
6ca3355a9SDevin Heitmueller   modification, are permitted provided that the following conditions are met:
7ca3355a9SDevin Heitmueller 
8ca3355a9SDevin Heitmueller   * Redistributions of source code must retain the above copyright notice,
9ca3355a9SDevin Heitmueller     this list of conditions and the following disclaimer.
10ca3355a9SDevin Heitmueller   * Redistributions in binary form must reproduce the above copyright notice,
11ca3355a9SDevin Heitmueller     this list of conditions and the following disclaimer in the documentation
12ca3355a9SDevin Heitmueller 	and/or other materials provided with the distribution.
13ca3355a9SDevin Heitmueller   * Neither the name of Trident Microsystems nor Hauppauge Computer Works
14ca3355a9SDevin Heitmueller     nor the names of its contributors may be used to endorse or promote
15ca3355a9SDevin Heitmueller 	products derived from this software without specific prior written
16ca3355a9SDevin Heitmueller 	permission.
17ca3355a9SDevin Heitmueller 
18ca3355a9SDevin Heitmueller   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19ca3355a9SDevin Heitmueller   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20ca3355a9SDevin Heitmueller   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21ca3355a9SDevin Heitmueller   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22ca3355a9SDevin Heitmueller   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23ca3355a9SDevin Heitmueller   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24ca3355a9SDevin Heitmueller   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25ca3355a9SDevin Heitmueller   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26ca3355a9SDevin Heitmueller   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27ca3355a9SDevin Heitmueller   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28ca3355a9SDevin Heitmueller   POSSIBILITY OF SUCH DAMAGE.
29ca3355a9SDevin Heitmueller */
30ca3355a9SDevin Heitmueller 
3138b2df95SDevin Heitmueller /*******************************************************************************
3238b2df95SDevin Heitmueller * FILENAME: $Id: drx_dap_fasi.h,v 1.5 2009/07/07 14:21:40 justin Exp $
3338b2df95SDevin Heitmueller *
3438b2df95SDevin Heitmueller * DESCRIPTION:
3538b2df95SDevin Heitmueller * Part of DRX driver.
3638b2df95SDevin Heitmueller * Data access protocol: Fast Access Sequential Interface (fasi)
3738b2df95SDevin Heitmueller * Fast access, because of short addressing format (16 instead of 32 bits addr)
3838b2df95SDevin Heitmueller * Sequential, because of I2C.
3938b2df95SDevin Heitmueller *
4038b2df95SDevin Heitmueller * USAGE:
4138b2df95SDevin Heitmueller * Include.
4238b2df95SDevin Heitmueller *
4338b2df95SDevin Heitmueller * NOTES:
4438b2df95SDevin Heitmueller *
4538b2df95SDevin Heitmueller *
4638b2df95SDevin Heitmueller *******************************************************************************/
4738b2df95SDevin Heitmueller 
4838b2df95SDevin Heitmueller /*-------- compilation control switches --------------------------------------*/
4938b2df95SDevin Heitmueller 
5038b2df95SDevin Heitmueller #ifndef __DRX_DAP_FASI_H__
5138b2df95SDevin Heitmueller #define __DRX_DAP_FASI_H__
5238b2df95SDevin Heitmueller 
5338b2df95SDevin Heitmueller /*-------- Required includes -------------------------------------------------*/
5438b2df95SDevin Heitmueller 
5538b2df95SDevin Heitmueller #include "drx_driver.h"
5638b2df95SDevin Heitmueller 
5738b2df95SDevin Heitmueller /*-------- Defines, configuring the API --------------------------------------*/
5838b2df95SDevin Heitmueller 
5938b2df95SDevin Heitmueller /********************************************
6038b2df95SDevin Heitmueller * Allowed address formats
6138b2df95SDevin Heitmueller ********************************************/
6238b2df95SDevin Heitmueller 
6338b2df95SDevin Heitmueller /*
6438b2df95SDevin Heitmueller * Comments about short/long addressing format:
6538b2df95SDevin Heitmueller *
6638b2df95SDevin Heitmueller * The DAP FASI offers long address format (4 bytes) and short address format
6738b2df95SDevin Heitmueller * (2 bytes). The DAP can operate in 3 modes:
6838b2df95SDevin Heitmueller * (1) only short
6938b2df95SDevin Heitmueller * (2) only long
70*868c9a17SMauro Carvalho Chehab * (3) both long and short but short preferred and long only when necessary
7138b2df95SDevin Heitmueller *
7238b2df95SDevin Heitmueller * These modes must be selected compile time via compile switches.
738ac1ed79SJoe Perches * Compile switch settings for the different modes:
7438b2df95SDevin Heitmueller * (1) DRXDAPFASI_LONG_ADDR_ALLOWED=0, DRXDAPFASI_SHORT_ADDR_ALLOWED=1
7538b2df95SDevin Heitmueller * (2) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=0
7638b2df95SDevin Heitmueller * (3) DRXDAPFASI_LONG_ADDR_ALLOWED=1, DRXDAPFASI_SHORT_ADDR_ALLOWED=1
7738b2df95SDevin Heitmueller *
7838b2df95SDevin Heitmueller * The default setting will be (3) both long and short.
7938b2df95SDevin Heitmueller * The default setting will need no compile switches.
8038b2df95SDevin Heitmueller * The default setting must be overridden if compile switches are already
8138b2df95SDevin Heitmueller * defined.
8238b2df95SDevin Heitmueller *
8338b2df95SDevin Heitmueller */
8438b2df95SDevin Heitmueller 
8538b2df95SDevin Heitmueller /* set default */
8638b2df95SDevin Heitmueller #if !defined(DRXDAPFASI_LONG_ADDR_ALLOWED)
8738b2df95SDevin Heitmueller #define  DRXDAPFASI_LONG_ADDR_ALLOWED 1
8838b2df95SDevin Heitmueller #endif
8938b2df95SDevin Heitmueller 
9038b2df95SDevin Heitmueller /* set default */
9138b2df95SDevin Heitmueller #if !defined(DRXDAPFASI_SHORT_ADDR_ALLOWED)
9238b2df95SDevin Heitmueller #define  DRXDAPFASI_SHORT_ADDR_ALLOWED 1
9338b2df95SDevin Heitmueller #endif
9438b2df95SDevin Heitmueller 
9538b2df95SDevin Heitmueller /* check */
9638b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && \
9738b2df95SDevin Heitmueller       (DRXDAPFASI_SHORT_ADDR_ALLOWED == 0))
9838b2df95SDevin Heitmueller #error  At least one of short- or long-addressing format must be allowed.
9938b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
10038b2df95SDevin Heitmueller #endif
10138b2df95SDevin Heitmueller 
10238b2df95SDevin Heitmueller /********************************************
10338b2df95SDevin Heitmueller * Single/master multi master setting
10438b2df95SDevin Heitmueller ********************************************/
10538b2df95SDevin Heitmueller /*
10638b2df95SDevin Heitmueller * Comments about SINGLE MASTER/MULTI MASTER  modes:
10738b2df95SDevin Heitmueller *
10838b2df95SDevin Heitmueller * Consider the two sides:1) the master and 2)the slave.
10938b2df95SDevin Heitmueller *
11038b2df95SDevin Heitmueller * Master:
11138b2df95SDevin Heitmueller * Single/multimaster operation set via DRXDAP_SINGLE_MASTER compile switch
11238b2df95SDevin Heitmueller *  + single master mode means no use of repeated starts
11338b2df95SDevin Heitmueller *  + multi master mode means use of repeated starts
11438b2df95SDevin Heitmueller *  Default is single master.
115*868c9a17SMauro Carvalho Chehab *  Default can be overridden by setting the compile switch DRXDAP_SINGLE_MASTER.
11638b2df95SDevin Heitmueller *
11738b2df95SDevin Heitmueller * Slave:
11838b2df95SDevin Heitmueller * Single/multi master selected via the flags in the FASI protocol.
11938b2df95SDevin Heitmueller *  + single master means remember memory address between i2c packets
12038b2df95SDevin Heitmueller *  + multimaster means flush memory address between i2c packets
12138b2df95SDevin Heitmueller *  Default is single master, DAP FASI changes multi-master setting silently
122*868c9a17SMauro Carvalho Chehab *  into single master setting. This cannot be overridden.
12338b2df95SDevin Heitmueller *
12438b2df95SDevin Heitmueller */
12538b2df95SDevin Heitmueller /* set default */
12638b2df95SDevin Heitmueller #ifndef DRXDAP_SINGLE_MASTER
12738b2df95SDevin Heitmueller #define DRXDAP_SINGLE_MASTER 0
12838b2df95SDevin Heitmueller #endif
12938b2df95SDevin Heitmueller 
13038b2df95SDevin Heitmueller /********************************************
13138b2df95SDevin Heitmueller * Chunk/mode checking
13238b2df95SDevin Heitmueller ********************************************/
13338b2df95SDevin Heitmueller /*
13438b2df95SDevin Heitmueller * Comments about DRXDAP_MAX_WCHUNKSIZE in single or multi master mode and
13538b2df95SDevin Heitmueller * in combination with short and long addressing format. All text below
13638b2df95SDevin Heitmueller * assumes long addressing format. The table also includes information
13738b2df95SDevin Heitmueller * for short ADDRessing format.
13838b2df95SDevin Heitmueller *
13938b2df95SDevin Heitmueller * In single master mode, data can be written by sending the register address
14038b2df95SDevin Heitmueller * first, then two or four bytes of data in the next packet.
14138b2df95SDevin Heitmueller * Because the device address plus a register address equals five bytes,
142*868c9a17SMauro Carvalho Chehab * the minimum chunk size must be five.
14338b2df95SDevin Heitmueller * If ten-bit I2C device addresses are used, the minimum chunk size must be six,
14438b2df95SDevin Heitmueller * because the I2C device address will then occupy two bytes when writing.
14538b2df95SDevin Heitmueller *
14638b2df95SDevin Heitmueller * Data in single master mode is transferred as follows:
14738b2df95SDevin Heitmueller * <S> <devW>  a0  a1  a2  a3  <P>
14838b2df95SDevin Heitmueller * <S> <devW>  d0  d1 [d2  d3] <P>
14938b2df95SDevin Heitmueller * ..
15038b2df95SDevin Heitmueller * or
15138b2df95SDevin Heitmueller * ..
15238b2df95SDevin Heitmueller * <S> <devW>  a0  a1  a2  a3  <P>
15338b2df95SDevin Heitmueller * <S> <devR> --- <P>
15438b2df95SDevin Heitmueller *
15538b2df95SDevin Heitmueller * In multi-master mode, the data must immediately follow the address (an I2C
15638b2df95SDevin Heitmueller * stop resets the internal address), and hence the minimum chunk size is
15738b2df95SDevin Heitmueller * 1 <I2C address> + 4 (register address) + 2 (data to send) = 7 bytes (8 if
15838b2df95SDevin Heitmueller * 10-bit I2C device addresses are used).
15938b2df95SDevin Heitmueller *
16038b2df95SDevin Heitmueller * The 7-bit or 10-bit i2c address parameters is a runtime parameter.
16138b2df95SDevin Heitmueller * The other parameters can be limited via compile time switches.
16238b2df95SDevin Heitmueller *
16338b2df95SDevin Heitmueller *-------------------------------------------------------------------------------
16438b2df95SDevin Heitmueller *
16538b2df95SDevin Heitmueller *  Minimum chunk size table (in bytes):
16638b2df95SDevin Heitmueller *
16738b2df95SDevin Heitmueller *       +----------------+----------------+
16838b2df95SDevin Heitmueller *       | 7b i2c addr    | 10b i2c addr   |
16938b2df95SDevin Heitmueller *       +----------------+----------------+
17038b2df95SDevin Heitmueller *       | single | multi | single | multi |
17138b2df95SDevin Heitmueller * ------+--------+-------+--------+-------+
17238b2df95SDevin Heitmueller * short | 3      | 5     | 4      | 6     |
17338b2df95SDevin Heitmueller * long  | 5      | 7     | 6      | 8     |
17438b2df95SDevin Heitmueller * ------+--------+-------+--------+-------+
17538b2df95SDevin Heitmueller *
17638b2df95SDevin Heitmueller */
17738b2df95SDevin Heitmueller 
17838b2df95SDevin Heitmueller /* set default */
17938b2df95SDevin Heitmueller #if !defined(DRXDAP_MAX_WCHUNKSIZE)
18038b2df95SDevin Heitmueller #define  DRXDAP_MAX_WCHUNKSIZE 254
18138b2df95SDevin Heitmueller #endif
18238b2df95SDevin Heitmueller 
18338b2df95SDevin Heitmueller /* check */
18438b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
18538b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER
18638b2df95SDevin Heitmueller #define  DRXDAP_MAX_WCHUNKSIZE_MIN 3
18738b2df95SDevin Heitmueller #else
18838b2df95SDevin Heitmueller #define  DRXDAP_MAX_WCHUNKSIZE_MIN 5
18938b2df95SDevin Heitmueller #endif
19038b2df95SDevin Heitmueller #else
19138b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER
19238b2df95SDevin Heitmueller #define  DRXDAP_MAX_WCHUNKSIZE_MIN 5
19338b2df95SDevin Heitmueller #else
19438b2df95SDevin Heitmueller #define  DRXDAP_MAX_WCHUNKSIZE_MIN 7
19538b2df95SDevin Heitmueller #endif
19638b2df95SDevin Heitmueller #endif
19738b2df95SDevin Heitmueller 
19838b2df95SDevin Heitmueller #if  DRXDAP_MAX_WCHUNKSIZE <  DRXDAP_MAX_WCHUNKSIZE_MIN
19938b2df95SDevin Heitmueller #if ((DRXDAPFASI_LONG_ADDR_ALLOWED == 0) && (DRXDAPFASI_SHORT_ADDR_ALLOWED == 1))
20038b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER
20138b2df95SDevin Heitmueller #error  DRXDAP_MAX_WCHUNKSIZE must be at least 3 in single master mode
20238b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
20338b2df95SDevin Heitmueller #else
20438b2df95SDevin Heitmueller #error  DRXDAP_MAX_WCHUNKSIZE must be at least 5 in multi master mode
20538b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
20638b2df95SDevin Heitmueller #endif
20738b2df95SDevin Heitmueller #else
20838b2df95SDevin Heitmueller #if DRXDAP_SINGLE_MASTER
20938b2df95SDevin Heitmueller #error  DRXDAP_MAX_WCHUNKSIZE must be at least 5 in single master mode
21038b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
21138b2df95SDevin Heitmueller #else
21238b2df95SDevin Heitmueller #error  DRXDAP_MAX_WCHUNKSIZE must be at least 7 in multi master mode
21338b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
21438b2df95SDevin Heitmueller #endif
21538b2df95SDevin Heitmueller #endif
21638b2df95SDevin Heitmueller #endif
21738b2df95SDevin Heitmueller 
21838b2df95SDevin Heitmueller /* set default */
21938b2df95SDevin Heitmueller #if !defined(DRXDAP_MAX_RCHUNKSIZE)
22038b2df95SDevin Heitmueller #define  DRXDAP_MAX_RCHUNKSIZE 254
22138b2df95SDevin Heitmueller #endif
22238b2df95SDevin Heitmueller 
22338b2df95SDevin Heitmueller /* check */
22438b2df95SDevin Heitmueller #if  DRXDAP_MAX_RCHUNKSIZE < 2
22538b2df95SDevin Heitmueller #error  DRXDAP_MAX_RCHUNKSIZE must be at least 2
22638b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
22738b2df95SDevin Heitmueller #endif
22838b2df95SDevin Heitmueller 
22938b2df95SDevin Heitmueller /* check */
23038b2df95SDevin Heitmueller #if  DRXDAP_MAX_RCHUNKSIZE & 1
23138b2df95SDevin Heitmueller #error  DRXDAP_MAX_RCHUNKSIZE must be even
23238b2df95SDevin Heitmueller *;				/* illegal statement to force compiler error */
23338b2df95SDevin Heitmueller #endif
23438b2df95SDevin Heitmueller 
23538b2df95SDevin Heitmueller /*-------- Public API functions ----------------------------------------------*/
23638b2df95SDevin Heitmueller 
23738b2df95SDevin Heitmueller #define DRXDAP_FASI_RMW           0x10000000
23838b2df95SDevin Heitmueller #define DRXDAP_FASI_BROADCAST     0x20000000
23938b2df95SDevin Heitmueller #define DRXDAP_FASI_CLEARCRC      0x80000000
24038b2df95SDevin Heitmueller #define DRXDAP_FASI_SINGLE_MASTER 0xC0000000
24138b2df95SDevin Heitmueller #define DRXDAP_FASI_MULTI_MASTER  0x40000000
24238b2df95SDevin Heitmueller #define DRXDAP_FASI_SMM_SWITCH    0x40000000	/* single/multi master switch */
24338b2df95SDevin Heitmueller #define DRXDAP_FASI_MODEFLAGS     0xC0000000
24438b2df95SDevin Heitmueller #define DRXDAP_FASI_FLAGS         0xF0000000
24538b2df95SDevin Heitmueller 
24638b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2BLOCK(addr)  (((addr)>>22)&0x3F)
24738b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2BANK(addr)   (((addr)>>16)&0x3F)
24838b2df95SDevin Heitmueller #define DRXDAP_FASI_ADDR2OFFSET(addr) ((addr)&0x7FFF)
24938b2df95SDevin Heitmueller 
25038b2df95SDevin Heitmueller #define DRXDAP_FASI_SHORT_FORMAT(addr)     (((addr) & 0xFC30FF80) == 0)
25138b2df95SDevin Heitmueller #define DRXDAP_FASI_LONG_FORMAT(addr)      (((addr) & 0xFC30FF80) != 0)
25238b2df95SDevin Heitmueller #define DRXDAP_FASI_OFFSET_TOO_LARGE(addr) (((addr) & 0x00008000) != 0)
25338b2df95SDevin Heitmueller 
25438b2df95SDevin Heitmueller #endif				/* __DRX_DAP_FASI_H__ */
255