blob: 81b778334002e8c73a3d1d6b17171bb46979d84c [file] [log] [blame] [edit]
/*
* Copyright (c) International Business Machines Corp., 2006
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/************************ BOE Engine offsets *********************************/
#define IIC_BOE_FIFO 0x00
#define IIC_BOE_CMD 0x01
#define IIC_BOE_MODE 0x02
#define IIC_BOE_WATER_MARK 0x03
#define IIC_BOE_INT_MASK 0x04
#define IIC_BOE_INT_COND 0x05
#define IIC_BOE_OR_INT_MASK 0x05
#define IIC_BOE_INTS 0x06
#define IIC_BOE_AND_INT_MASK 0x06
#define IIC_BOE_STAT 0x07
#define IIC_BOE_RESET_I2C 0x07
#define IIC_BOE_ESTAT 0x08
#define IIC_BOE_RESET_ERR 0x08
#define IIC_BOE_RESID_LEN 0x09
#define IIC_BOE_SET_SCL 0x09
#define IIC_BOE_RESERVED 0x0a
#define IIC_BOE_PORTBUSY 0x0a
#define IIC_BOE_RESET_SCL 0x0b
#define IIC_BOE_SET_SDA 0x0c
#define IIC_BOE_RESET_SDA 0x0d
#define IIC_BOE_MAX_OFFSET IIC_BOE_RESET_SDA
/************************ BOE Bit Definitions ********************************/
#define IIC_BOE_MAX_BUSES 16
#define IIC_BOE_MAX_FIFO_SIZE 32
#define IIC_BOE_DFLT_FIFO_SIZE 8
/* cmd register bits */
#define IIC_BOE_WITH_START 0x80000000
#define IIC_BOE_WITH_ADDR 0x40000000
#define IIC_BOE_RD_CONT 0x20000000
#define IIC_BOE_WITH_STOP 0x10000000
#define IIC_BOE_FORCE_LAUNCH 0x08000000
#define IIC_BOE_ADDR 0x00fe0000
#define IIC_BOE_ADDR_SHIFT 16
#define IIC_BOE_READ 0x00010000
#define IIC_BOE_XFR_LEN 0x0000ffff
#define IIC_BOE_MK_ADDR(addr) ((addr << IIC_BOE_ADDR_SHIFT) & IIC_BOE_ADDR)
#define IIC_BOE_GET_ADDR(r) ((r & IIC_BOE_ADDR) >> IIC_BOE_ADDR_SHIFT)
/* mode register bits */
#define IIC_BOE_CLKDIV_LO 0xff000000
#define IIC_BOE_CLKDIV_LO_SHIFT 24
#define IIC_BOE_PORT 0x00ff0000
#define IIC_BOE_PORT_SHIFT 16
#define IIC_BOE_MODE_RSVD 0x0000ff00
#define IIC_BOE_CLKDIV_HI 0x000000f0
#define IIC_BOE_CLKDIV_HI_SHIFT 4
#define IIC_BOE_ENHANCED 0x00000008
#define IIC_BOE_DIAG 0x00000004
#define IIC_BOE_PACE_ALLOW 0x00000002
#define IIC_BOE_WRAP 0x00000001
#define IIC_BOE_GET_PORT(r) ((r & IIC_BOE_PORT) >> IIC_BOE_PORT_SHIFT)
#define IIC_BOE_MK_PORT(p) ((p << IIC_BOE_PORT_SHIFT) & IIC_BOE_PORT)
#define IIC_BOE_MK_CLKDIV(val) \
((val << IIC_BOE_CLKDIV_LO_SHIFT) | \
((val >> IIC_BOE_CLKDIV_HI_SHIFT) & IIC_BOE_CLKDIV_HI))
#define IIC_BOE_GET_CLKDIV(r) \
(((r & IIC_BOE_CLKDIV_LO) >> IIC_BOE_CLKDIV_LO_SHIFT) | \
((r & IIC_BOE_CLKDIV_HI) << IIC_BOE_CLKDIV_HI_SHIFT))
/* Z7 plus mode register */
#define IIC_BOE_Z7_CLKDIV 0xffff0000
#define IIC_BOE_Z7_CLKDIV_SHIFT 16
#define IIC_BOE_Z7_PORT 0x0000fc00
#define IIC_BOE_Z7_PORT_SHIFT 10
#define IIC_BOE_Z7_GET_PORT(r) ((r & IIC_BOE_Z7_PORT) >> IIC_BOE_Z7_PORT_SHIFT)
#define IIC_BOE_Z7_MK_PORT(p) ((p << IIC_BOE_Z7_PORT_SHIFT) & IIC_BOE_Z7_PORT)
#define IIC_BOE_Z7_MK_CLKDIV(val) ((val << IIC_BOE_Z7_CLKDIV_SHIFT))
#define IIC_BOE_Z7_GET_CLKDIV(r) ((r & IIC_BOE_Z7_CLKDIV) >> IIC_BOE_Z7_CLKDIV_SHIFT)
/* water mark register bits */
#define IIC_BOE_HI_MRK 0x0000ff00
#define IIC_BOE_HI_MRK_SHIFT 8
#define IIC_BOE_LO_MRK 0x000000ff
#define IIC_BOE_LO_MRK_SHIFT 0
#define IIC_BOE_GET_LO_MRK(e) ((e->regs[IIC_BOE_WATER_MARK] & \
IIC_BOE_LO_MRK) >> \
IIC_BOE_LO_MRK_SHIFT)
#define IIC_BOE_MK_WATER_MRK(hi, lo)\
((((hi) << IIC_BOE_HI_MRK_SHIFT) & IIC_BOE_HI_MRK) |\
(((lo) << IIC_BOE_LO_MRK_SHIFT) & IIC_BOE_LO_MRK))
#define IIC_BOE_GET_HI_MRK(e) ((e->regs[IIC_BOE_WATER_MARK] & \
IIC_BOE_HI_MRK) >> \
IIC_BOE_HI_MRK_SHIFT)
/* interrupt, interrupt mask, interrupt condition bits */
#define IIC_BOE_INVALID_CMD 0x00008000
#define IIC_BOE_PARITY 0x00004000
#define IIC_BOE_BE_OVERRUN 0x00002000
#define IIC_BOE_BE_ACCESS 0x00001000
#define IIC_BOE_LOST_ARB 0x00000800
#define IIC_BOE_NACK 0x00000400
#define IIC_BOE_DAT_REQ 0x00000200
#define IIC_BOE_CMD_COMP 0x00000100
#define IIC_BOE_STOP_ERR 0x00000080
#define IIC_BOE_BUSY 0x00000040
#define IIC_BOE_IDLE 0x00000020
#define IIC_BOE_ALL_INTS 0x0000ffff
#define IIC_BOE_FE_ERRS (IIC_BOE_LOST_ARB | IIC_BOE_NACK | \
IIC_BOE_STOP_ERR)
#define IIC_BOE_BE_ERRS (IIC_BOE_INVALID_CMD | IIC_BOE_PARITY | \
IIC_BOE_BE_OVERRUN | IIC_BOE_BE_ACCESS)
#define IIC_BOE_ANY_ERR (IIC_BOE_BE_ERRS | IIC_BOE_FE_ERRS)
/* status register bits */
#define IIC_BOE_S_INVALID_CMD 0x80000000
#define IIC_BOE_S_PARITY 0x40000000
#define IIC_BOE_S_BE_OVERRUN 0x20000000
#define IIC_BOE_S_BE_ACCESS 0x10000000
#define IIC_BOE_S_LOST_ARB 0x08000000
#define IIC_BOE_S_NACK 0x04000000
#define IIC_BOE_S_DAT_REQ 0x02000000
#define IIC_BOE_S_CMD_COMP 0x01000000
#define IIC_BOE_S_STOP_ERR 0x00800000
#define IIC_BOE_STAT_SHIFT 16
#define IIC_BOE_MAX_PORT 0x000f0000
#define IIC_BOE_MAX_PORT_SHIFT 16
#define IIC_BOE_ANY_INT 0x00008000
#define IIC_BOE_SCL_IN 0x00000800
#define IIC_BOE_SDA_IN 0x00000400
#define IIC_BOE_PORT_BUSY 0x00000200
#define IIC_BOE_SELF_BUSY 0x00000100
#define IIC_BOE_FIFO_COUNT 0x000000ff
#define IIC_BOE_S_BE_ERRS (IIC_BOE_BE_ERRS << IIC_BOE_STAT_SHIFT)
#define IIC_BOE_S_FE_ERRS (IIC_BOE_FE_ERRS << IIC_BOE_STAT_SHIFT)
#define IIC_BOE_S_ANY_ERR (IIC_BOE_ANY_ERR << IIC_BOE_STAT_SHIFT)
/* extended status register bits */
#define IIC_BOE_FIFO_SZ 0xff000000
#define IIC_BOE_FIFO_SZ_SHIFT 24
#define IIC_BOE_SCL_IN_SYN 0x00008000
#define IIC_BOE_SDA_IN_SYN 0x00004000
#define IIC_BOE_S_SCL 0x00002000
#define IIC_BOE_S_SDA 0x00001000
#define IIC_BOE_M_SCL 0x00000800
#define IIC_BOE_M_SDA 0x00000400
#define IIC_BOE_HI_WATER 0x00000200
#define IIC_BOE_LO_WATER 0x00000100
#define IIC_BOE_ES_PORT_BUSY 0x00000080
#define IIC_BOE_ES_SELF_BUSY 0x00000040
#define IIC_BOE_VERSION 0x0000001f
/* residual length register bits */
#define IIC_BOE_FE_LEN 0xffff0000
#define IIC_BOE_FE_LEN_SHIFT 16
#define IIC_BOE_BE_LEN 0x0000ffff
#define IIC_BOE_GET_BE(r) (r & IIC_BOE_BE_LEN)
#define IIC_BOE_GET_FE(r) (r >> IIC_BOE_FE_LEN_SHIFT)
/* Murano/Centaur port busy register */
#define IIC_BOE_PORT_BUSY_REST 0x80000000