blob: 9a0762aef32a7c09aaaaa6b635ec1aae05cf9584 [file] [log] [blame]
/**
* File : sdio_spec.h
* Addresses defined by SDIO Specifications
*
*
* Copyright (C) 2003-2009, Marvell International Ltd.
*
* This software file (the "File") is distributed by Marvell International
* Ltd. under the terms of the GNU General Public License Version 2, June 1991
* (the "License"). You may use, redistribute and/or modify this File in
* accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.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 License provides additional details about
* this warranty disclaimer.
*
*/
#ifndef _SDIOSPEC_H_
#define _SDIOSPEC_H_
#define MAX_SDIO_TUPLE_BODY_LEN 255
/* CCCR (Card Common Control Registers) */
#define CCCR_SDIO_REV_REG 0x00
#define CCCR_FORMAT_VERSION(reg) (((reg) & 0xf0 >> 4))
#define SDIO_SPEC_REVISION(reg) (((reg) & 0x0f))
#define SD_SPEC_REV_REG 0x01
#define SD_PHYS_SPEC_VERSION(reg) (((reg) & 0x0f))
#define IO_ENABLE_REG 0x02
#define IOE(x) (0x1U << (x))
#define IOE_1 IOE(1)
#define IOE_2 IOE(2)
#define IOE_3 IOE(3)
#define IOE_4 IOE(4)
#define IOE_5 IOE(5)
#define IOE_6 IOE(6)
#define IOE_7 IOE(7)
#define IO_READY_REG 0x03
#define IOR(x) (0x1U << (x))
#define IOR_1 IOR(1)
#define IOR_2 IOR(2)
#define IOR_3 IOR(3)
#define IOR_4 IOR(4)
#define IOR_5 IOR(5)
#define IOR_6 IOR(6)
#define IOR_7 IOR(7)
#define INT_ENABLE_REG 0x04
#define IENM 0x1
#define IEN(x) (0x1U << (x))
#define IEN_1 IEN(1)
#define IEN_2 IEN(2)
#define IEN_3 IEN(3)
#define IEN_4 IEN(4)
#define IEN_5 IEN(5)
#define IEN_6 IEN(6)
#define IEN_7 IEN(7)
#define INT_PENDING_REG 0x05
#define INT(x) (0x1U << (x))
#define INT_1 INT(1)
#define INT_2 INT(2)
#define INT_3 INT(3)
#define INT_4 INT(4)
#define INT_5 INT(5)
#define INT_6 INT(6)
#define INT_7 INT(7)
#define IO_ABORT_REG 0x06
#define AS(x) ((x) & 0x7)
#define AS_1 AS(1)
#define AS_2 AS(2)
#define AS_3 AS(3)
#define AS_4 AS(4)
#define AS_5 AS(5)
#define AS_6 AS(6)
#define AS_7 AS(7)
#define RES (0x00)
#define BUS_INTERFACE_CONTROL_REG 0x07
#define BUS_WIDTH(reg) ((reg) & 0x3)
#define CD_DISABLE (0x1U << 7)
#define CARD_CAPABILITY_REG 0x08
#define SDC (0x1U << 0)
#define SMB (0x1U << 1)
#define SRW (0x1U << 2)
#define SBS (0x1U << 3)
#define S4MI (0x1U << 4)
#define E4MI (0x1U << 5)
#define LSC (0x1U << 6)
#define S4BLS (0x1U << 7)
#define COMMON_CIS_POINTER_0_REG 0x09
#define COMMON_CIS_POINTER_1_REG 0x0a
#define COMMON_CIS_POINTER_2_REG 0x0b
#define BUS_SUSPEND_REG 0x0c
#define BUS_STATUS (0x1U << 0)
#define BUS_REL_REQ_STATUS (0x1U << 1)
#define FUNCTION_SELECT_REG 0x0d
#ifdef FS
#undef FS
#endif
#define FS(x) ((x) & 0xf)
#define FS_1 FS(1)
#define FS_2 FS(2)
#define FS_3 FS(3)
#define FS_4 FS(4)
#define FS_5 FS(5)
#define FS_6 FS(6)
#define FS_7 FS(7)
#define FS_MEM FS(8)
#define DF (0x1U << 7)
#define EXEC_FLAGS_REG 0x0e
#define EXM 0x0
#define EX(x) (0x1U << (x))
#define EX_1 EX(1)
#define EX_2 EX(2)
#define EX_3 EX(3)
#define EX_4 EX(4)
#define EX_5 EX(5)
#define EX_6 EX(6)
#define EX_7 EX(7)
#define READY_FLAGS_REG 0x0f
#define RFM 0x0
#define RF(x) (0x1U << (x))
#define RF_1 RF(1)
#define RF_2 RF(2)
#define RF_3 RF(3)
#define RF_4 RF(4)
#define RF_5 RF(5)
#define RF_6 RF(6)
#define RF_7 IEN(7)
/* FBR (Function Basic Registers) */
#define FN_CSA_REG(x) (0x100 * (x) + 0x00)
#define FN_CIS_POINTER_0_REG(x) (0x100 * (x) + 0x09)
#define FN_CIS_POINTER_1_REG(x) (0x100 * (x) + 0x0a)
#define FN_CIS_POINTER_2_REG(x) (0x100 * (x) + 0x0b)
#define FN_CSA_DAT_REG(x) (0x100 * (x) + 0x0f)
#define FN_BLOCK_SIZE_0_REG(x) (0x100 * (x) + 0x10)
#define FN_BLOCK_SIZE_1_REG(x) (0x100 * (x) + 0x11)
/* Function 0 -- duplicate, see the CCRC section */
#define FN0_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(1)
#define FN0_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(1)
#define FN0_CIS_POINTER_2_REG FN_CIS_POINTER_1_REG(1)
#define FN0_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(1)
#define FN0_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(1)
/* Function 1 */
#define FN1_CSA_REG FN_CSA_REG(1)
#define FN1_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(1)
#define FN1_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(1)
#define FN1_CIS_POINTER_2_REG FN_CIS_POINTER_1_REG(1)
#define FN1_CSA_DAT_REG FN_CSA_DAT_REG(1)
#define FN1_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(1)
#define FN1_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(1)
/* Function 2 */
#define FN2_CSA_REG FN_CSA_REG(2)
#define FN2_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(2)
#define FN2_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(2)
#define FN2_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(2)
#define FN2_CSA_DAT_REG FN_CSA_DAT_REG(2)
#define FN2_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(2)
#define FN2_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(2)
/* Function 3 */
#define FN3_CSA_REG FN_CSA_REG(3)
#define FN3_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(3)
#define FN3_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(3)
#define FN3_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(3)
#define FN3_CSA_DAT_REG FN_CSA_DAT_REG(3)
#define FN3_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(3)
#define FN3_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(3)
/* Function 4 */
#define FN4_CSA_REG FN_CSA_REG(4)
#define FN4_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(4)
#define FN4_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(4)
#define FN4_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(4)
#define FN4_CSA_DAT_REG FN_CSA_DAT_REG(4)
#define FN4_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(4)
#define FN4_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(4)
/* Function 5 */
#define FN5_CSA_REG FN_CSA_REG(5)
#define FN5_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(5)
#define FN5_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(5)
#define FN5_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(5)
#define FN5_CSA_DAT_REG FN_CSA_DAT_REG(5)
#define FN5_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(5)
#define FN5_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(5)
/* Function 6 */
#define FN6_CSA_REG FN_CSA_REG(6)
#define FN6_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(6)
#define FN6_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(6)
#define FN6_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(6)
#define FN6_CSA_DAT_REG FN_CSA_DAT_REG(6)
#define FN6_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(6)
#define FN6_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(6)
/* Function 7 */
#define FN7_CSA_REG FN_CSA_REG(7)
#define FN7_CIS_POINTER_0_REG FN_CIS_POINTER_0_REG(7)
#define FN7_CIS_POINTER_1_REG FN_CIS_POINTER_1_REG(7)
#define FN7_CIS_POINTER_2_REG FN_CIS_POINTER_2_REG(7)
#define FN7_CSA_DAT_REG FN_CSA_DAT_REG(7)
#define FN7_BLOCK_SIZE_0_REG FN_BLOCK_SIZE_0_REG(7)
#define FN7_BLOCK_SIZE_1_REG FN_BLOCK_SIZE_1_REG(7)
/* FBR bit definitions */
#define FN_IODEV_INTERFACE_CODE(reg) ((reg) & 0xf)
#define FN_SUPPORTS_CSA (0x1U << 6)
#define FN_CSA_ENABLE (0x1U << 7)
/* Misc. helper definitions */
#define FN(x) (x)
#define FN0 FN(0)
#define FN1 FN(1)
#define FN2 FN(2)
#define FN3 FN(3)
#define FN4 FN(4)
#define FN5 FN(5)
#define FN6 FN(6)
#define FN7 FN(7)
#endif /* __SDIO_SPEC__H */