/********************************************************************************
 * Marvell GPL License Option
 *
 * If you received this File from Marvell, you may opt to use, redistribute and/or
 * modify this File in accordance with the terms and conditions of the General
 * Public License Version 2, June 1991 (the "GPL License"), a copy of which is
 * available along with the File in the license.txt file or by writing to the Free
 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
 * on the worldwide web at http://www.gnu.org/licenses/gpl.txt.
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
 * DISCLAIMED.  The GPL License provides additional details about this warranty
 * disclaimer.
 ******************************************************************************/

//////
/// don't edit! auto-generated by docc: ahb2spi.h
////////////////////////////////////////////////////////////
#ifndef ahb2spi_h
#define ahb2spi_h (){}


#include "ctypes.h"

#pragma pack(1)
#ifdef __cplusplus
  extern "C" {
#endif

#ifndef _DOCC_H_BITOPS_
#define _DOCC_H_BITOPS_ (){}

    #define _bSETMASK_(b)                                      ((b)<32 ? (1<<((b)&31)) : 0)
    #define _NSETMASK_(msb,lsb)                                (_bSETMASK_((msb)+1)-_bSETMASK_(lsb))
    #define _bCLRMASK_(b)                                      (~_bSETMASK_(b))
    #define _NCLRMASK_(msb,lsb)                                (~_NSETMASK_(msb,lsb))
    #define _BFGET_(r,msb,lsb)                                 (_NSETMASK_((msb)-(lsb),0)&((r)>>(lsb)))
    #define _BFSET_(r,msb,lsb,v)                               do{ (r)&=_NCLRMASK_(msb,lsb); (r)|=_NSETMASK_(msb,lsb)&((v)<<(lsb)); }while(0)

#endif



//////
/// 
/// $INTERFACE SPIarray                                 (4,4)
///     # # ----------------------------------------------------------
///     @ 0x00000                      (W-)
///     #         # Stuffing bytes...
///               %% 1073741792
///     @ 0x7FFFFFC Last                 (P)
///               %unsigned 32 entry                     
///     # # ----------------------------------------------------------
/// $ENDOFINTERFACE  # size:134217728B, bits:      32b, padding:     0B
////////////////////////////////////////////////////////////
#ifndef h_SPIarray
#define h_SPIarray (){}

    #define     RA_SPIarray_Last                               0x7FFFFFC

    #define     BA_SPIarray_Last_entry                         0x7FFFFFC
    #define     B16SPIarray_Last_entry                         0x7FFFFFC
    #define   LSb32SPIarray_Last_entry                            0
    #define   LSb16SPIarray_Last_entry                            0
    #define       bSPIarray_Last_entry                         32
    #define   MSK32SPIarray_Last_entry                            0xFFFFFFFF
    ///////////////////////////////////////////////////////////

    typedef struct SIE_SPIarray {
    ///////////////////////////////////////////////////////////
             UNSG8 RSVDx0                                      [134217724];
    ///////////////////////////////////////////////////////////
    #define   GET32SPIarray_Last_entry(r32)                    _BFGET_(r32,31, 0)
    #define   SET32SPIarray_Last_entry(r32,v)                  _BFSET_(r32,31, 0,v)

    #define     w32SPIarray_Last                               {\
            UNSG32 uLast_entry                                 : 32;\
          }
    union { UNSG32 u32SPIarray_Last;
            struct w32SPIarray_Last;
          };
    ///////////////////////////////////////////////////////////
    } SIE_SPIarray;

    typedef union  T32SPIarray_Last
          { UNSG32 u32;
            struct w32SPIarray_Last;
                 } T32SPIarray_Last;
    ///////////////////////////////////////////////////////////

    typedef union  TSPIarray_Last
          { UNSG32 u32[1];
            struct {
            struct w32SPIarray_Last;
                   };
                 } TSPIarray_Last;

    ///////////////////////////////////////////////////////////
     SIGN32 SPIarray_drvrd(SIE_SPIarray *p, UNSG32 base, SIGN32 mem, SIGN32 tst);
     SIGN32 SPIarray_drvwr(SIE_SPIarray *p, UNSG32 base, SIGN32 mem, SIGN32 tst, UNSG32 *pcmd);
       void SPIarray_reset(SIE_SPIarray *p);
     SIGN32 SPIarray_cmp  (SIE_SPIarray *p, SIE_SPIarray *pie, char *pfx, void *hLOG, SIGN32 mem, SIGN32 tst);
    #define SPIarray_check(p,pie,pfx,hLOG) SPIarray_cmp(p,pie,pfx,(void*)(hLOG),0,0)
    #define SPIarray_print(p,    pfx,hLOG) SPIarray_cmp(p,0,  pfx,(void*)(hLOG),0,0)

#endif
//////
/// ENDOFINTERFACE: SPIarray
////////////////////////////////////////////////////////////

//////
/// 
/// $INTERFACE ahb2spi                 biu              (4,4)
///     # # ----------------------------------------------------------
///     @ 0x00000 SPI_FLASH            (P)
///     # 0x00000 words                
///               $SPIarray            words             MEM          
///     # # ----------------------------------------------------------
/// $ENDOFINTERFACE  # size:134217728B, bits:      32b, padding:     0B
////////////////////////////////////////////////////////////
#ifndef h_ahb2spi
#define h_ahb2spi (){}

    #define     RA_ahb2spi_SPI_FLASH                           0x0000
    #define     RA_ahb2spi_words                               0x0000
    ///////////////////////////////////////////////////////////

    typedef struct SIE_ahb2spi {
    ///////////////////////////////////////////////////////////
              SIE_SPIarray                                     ie_words;
    ///////////////////////////////////////////////////////////
    } SIE_ahb2spi;

    ///////////////////////////////////////////////////////////
     SIGN32 ahb2spi_drvrd(SIE_ahb2spi *p, UNSG32 base, SIGN32 mem, SIGN32 tst);
     SIGN32 ahb2spi_drvwr(SIE_ahb2spi *p, UNSG32 base, SIGN32 mem, SIGN32 tst, UNSG32 *pcmd);
       void ahb2spi_reset(SIE_ahb2spi *p);
     SIGN32 ahb2spi_cmp  (SIE_ahb2spi *p, SIE_ahb2spi *pie, char *pfx, void *hLOG, SIGN32 mem, SIGN32 tst);
    #define ahb2spi_check(p,pie,pfx,hLOG) ahb2spi_cmp(p,pie,pfx,(void*)(hLOG),0,0)
    #define ahb2spi_print(p,    pfx,hLOG) ahb2spi_cmp(p,0,  pfx,(void*)(hLOG),0,0)

#endif
//////
/// ENDOFINTERFACE: ahb2spi
////////////////////////////////////////////////////////////



#ifdef __cplusplus
  }
#endif
#pragma  pack()

#endif
//////
/// ENDOFFILE: ahb2spi.h
////////////////////////////////////////////////////////////

