mmc: Import MMC/SDCard support from libusb

This commit is contained in:
Sebastian Huber
2015-03-16 22:10:36 +01:00
parent 024e064449
commit fc9e83bb68
21 changed files with 7140 additions and 53 deletions

View File

@@ -88,6 +88,13 @@ RTEMS_BSD_DEFINE_NEXUS_DEVICE(cgem, 0, RTEMS_ARRAY_SIZE(cgem0_res),
SYSINIT_DRIVER_REFERENCE(e1000phy, miibus);
#elif defined(LIBBSP_ARM_ALTERA_CYCLONE_V_BSP_H)
RTEMS_BSD_DEFINE_NEXUS_DEVICE(dw_mmc, 0, 0, NULL);
SYSINIT_DRIVER_REFERENCE(mmc, dw_mmc);
SYSINIT_DRIVER_REFERENCE(mmcsd, mmc);
#elif defined(LIBBSP_POWERPC_QORIQ_BSP_H)
#if !QORIQ_CHIP_IS_T_VARIANT(QORIQ_CHIP_VARIANT)

View File

@@ -0,0 +1,79 @@
/*
* This file is produced automatically.
* Do not modify anything in here by hand.
*
* Created from source file
* dev/mmc/mmcbr_if.m
* with
* makeobjops.awk
*
* See the source file for legal information
*/
#ifndef _mmcbr_if_h_
#define _mmcbr_if_h_
/** @brief Unique descriptor for the MMCBR_UPDATE_IOS() method */
extern struct kobjop_desc mmcbr_update_ios_desc;
/** @brief A function implementing the MMCBR_UPDATE_IOS() method */
typedef int mmcbr_update_ios_t(device_t brdev, device_t reqdev);
static __inline int MMCBR_UPDATE_IOS(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbr_update_ios);
return ((mmcbr_update_ios_t *) _m)(brdev, reqdev);
}
/** @brief Unique descriptor for the MMCBR_REQUEST() method */
extern struct kobjop_desc mmcbr_request_desc;
/** @brief A function implementing the MMCBR_REQUEST() method */
typedef int mmcbr_request_t(device_t brdev, device_t reqdev,
struct mmc_request *req);
static __inline int MMCBR_REQUEST(device_t brdev, device_t reqdev,
struct mmc_request *req)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbr_request);
return ((mmcbr_request_t *) _m)(brdev, reqdev, req);
}
/** @brief Unique descriptor for the MMCBR_GET_RO() method */
extern struct kobjop_desc mmcbr_get_ro_desc;
/** @brief A function implementing the MMCBR_GET_RO() method */
typedef int mmcbr_get_ro_t(device_t brdev, device_t reqdev);
static __inline int MMCBR_GET_RO(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbr_get_ro);
return ((mmcbr_get_ro_t *) _m)(brdev, reqdev);
}
/** @brief Unique descriptor for the MMCBR_ACQUIRE_HOST() method */
extern struct kobjop_desc mmcbr_acquire_host_desc;
/** @brief A function implementing the MMCBR_ACQUIRE_HOST() method */
typedef int mmcbr_acquire_host_t(device_t brdev, device_t reqdev);
static __inline int MMCBR_ACQUIRE_HOST(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbr_acquire_host);
return ((mmcbr_acquire_host_t *) _m)(brdev, reqdev);
}
/** @brief Unique descriptor for the MMCBR_RELEASE_HOST() method */
extern struct kobjop_desc mmcbr_release_host_desc;
/** @brief A function implementing the MMCBR_RELEASE_HOST() method */
typedef int mmcbr_release_host_t(device_t brdev, device_t reqdev);
static __inline int MMCBR_RELEASE_HOST(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbr_release_host);
return ((mmcbr_release_host_t *) _m)(brdev, reqdev);
}
#endif /* _mmcbr_if_h_ */

View File

@@ -0,0 +1,55 @@
/*
* This file is produced automatically.
* Do not modify anything in here by hand.
*
* Created from source file
* dev/mmc/mmcbus_if.m
* with
* makeobjops.awk
*
* See the source file for legal information
*/
#ifndef _mmcbus_if_h_
#define _mmcbus_if_h_
/** @brief Unique descriptor for the MMCBUS_WAIT_FOR_REQUEST() method */
extern struct kobjop_desc mmcbus_wait_for_request_desc;
/** @brief A function implementing the MMCBUS_WAIT_FOR_REQUEST() method */
typedef int mmcbus_wait_for_request_t(device_t brdev, device_t reqdev,
struct mmc_request *req);
static __inline int MMCBUS_WAIT_FOR_REQUEST(device_t brdev, device_t reqdev,
struct mmc_request *req)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbus_wait_for_request);
return ((mmcbus_wait_for_request_t *) _m)(brdev, reqdev, req);
}
/** @brief Unique descriptor for the MMCBUS_ACQUIRE_BUS() method */
extern struct kobjop_desc mmcbus_acquire_bus_desc;
/** @brief A function implementing the MMCBUS_ACQUIRE_BUS() method */
typedef int mmcbus_acquire_bus_t(device_t brdev, device_t reqdev);
static __inline int MMCBUS_ACQUIRE_BUS(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbus_acquire_bus);
return ((mmcbus_acquire_bus_t *) _m)(brdev, reqdev);
}
/** @brief Unique descriptor for the MMCBUS_RELEASE_BUS() method */
extern struct kobjop_desc mmcbus_release_bus_desc;
/** @brief A function implementing the MMCBUS_RELEASE_BUS() method */
typedef int mmcbus_release_bus_t(device_t brdev, device_t reqdev);
static __inline int MMCBUS_RELEASE_BUS(device_t brdev, device_t reqdev)
{
kobjop_t _m;
KOBJOPLOOKUP(((kobj_t)brdev)->ops,mmcbus_release_bus);
return ((mmcbus_release_bus_t *) _m)(brdev, reqdev);
}
#endif /* _mmcbus_if_h_ */

64
rtemsbsd/local/mmcbr_if.c Normal file
View File

@@ -0,0 +1,64 @@
#include <machine/rtems-bsd-kernel-space.h>
/*
* This file is produced automatically.
* Do not modify anything in here by hand.
*
* Created from source file
* freebsd-org/sys/dev/mmc/mmcbr_if.m
* with
* makeobjops.awk
*
* See the source file for legal information
*/
#include <rtems/bsd/sys/param.h>
#include <sys/queue.h>
#include <sys/kernel.h>
#include <sys/kobj.h>
#include <sys/types.h>
#include <sys/bus.h>
#include <dev/mmc/bridge.h>
#include <dev/mmc/mmcreg.h>
#include <rtems/bsd/local/mmcbr_if.h>
struct kobj_method mmcbr_update_ios_method_default = {
&mmcbr_update_ios_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbr_update_ios_desc = {
0, &mmcbr_update_ios_method_default
};
struct kobj_method mmcbr_request_method_default = {
&mmcbr_request_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbr_request_desc = {
0, &mmcbr_request_method_default
};
struct kobj_method mmcbr_get_ro_method_default = {
&mmcbr_get_ro_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbr_get_ro_desc = {
0, &mmcbr_get_ro_method_default
};
struct kobj_method mmcbr_acquire_host_method_default = {
&mmcbr_acquire_host_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbr_acquire_host_desc = {
0, &mmcbr_acquire_host_method_default
};
struct kobj_method mmcbr_release_host_method_default = {
&mmcbr_release_host_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbr_release_host_desc = {
0, &mmcbr_release_host_method_default
};

View File

@@ -0,0 +1,47 @@
#include <machine/rtems-bsd-kernel-space.h>
/*
* This file is produced automatically.
* Do not modify anything in here by hand.
*
* Created from source file
* freebsd-org/sys/dev/mmc/mmcbus_if.m
* with
* makeobjops.awk
*
* See the source file for legal information
*/
#include <rtems/bsd/sys/param.h>
#include <sys/queue.h>
#include <sys/kernel.h>
#include <sys/kobj.h>
#include <sys/bus.h>
#include <dev/mmc/mmcreg.h>
#include <dev/mmc/bridge.h>
#include <rtems/bsd/local/mmcbus_if.h>
struct kobj_method mmcbus_wait_for_request_method_default = {
&mmcbus_wait_for_request_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbus_wait_for_request_desc = {
0, &mmcbus_wait_for_request_method_default
};
struct kobj_method mmcbus_acquire_bus_method_default = {
&mmcbus_acquire_bus_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbus_acquire_bus_desc = {
0, &mmcbus_acquire_bus_method_default
};
struct kobj_method mmcbus_release_bus_method_default = {
&mmcbus_release_bus_desc, (kobjop_t) kobj_error_method
};
struct kobjop_desc mmcbus_release_bus_desc = {
0, &mmcbus_release_bus_method_default
};

View File

@@ -151,7 +151,7 @@ rtems_bsd_scsi_inquiry(union ccb *ccb, struct scsi_inquiry_data *inq_data)
rtems_bsd_ccb_callback,
BSD_SCSI_TAG,
(u_int8_t *) inq_data,
sizeof(*inq_data) - 1,
SHORT_INQUIRY_LENGTH,
FALSE,
0,
SSD_MIN_SIZE,
@@ -339,11 +339,11 @@ rtems_bsd_sim_attach_worker(rtems_media_state state, const char *src, char **des
}
sc = rtems_bsd_scsi_inquiry(&sim->ccb, &inq_data);
if (sc != RTEMS_SUCCESSFUL) {
if (sc == RTEMS_SUCCESSFUL) {
scsi_print_inquiry(&inq_data);
} else {
BSD_PRINTF("OOPS: inquiry failed\n");
goto error;
}
scsi_print_inquiry(&inq_data);
for (retries = 0; retries <= 3; ++retries) {
sc = rtems_bsd_scsi_test_unit_ready(&sim->ccb);
@@ -353,10 +353,14 @@ rtems_bsd_sim_attach_worker(rtems_media_state state, const char *src, char **des
}
if (sc != RTEMS_SUCCESSFUL) {
BSD_PRINTF("OOPS: test unit ready failed\n");
goto error;
}
sc = rtems_bsd_scsi_read_capacity(&sim->ccb, &block_count, &block_size);
for (retries = 0; retries <= 3; ++retries) {
sc = rtems_bsd_scsi_read_capacity(&sim->ccb, &block_count, &block_size);
if (sc == RTEMS_SUCCESSFUL) {
break;
}
}
if (sc != RTEMS_SUCCESSFUL) {
BSD_PRINTF("OOPS: read capacity failed\n");
goto error;

View File

@@ -0,0 +1,58 @@
/**
* @file
*
* @ingroup rtems_bsd_rtems
*
* @brief TODO.
*/
/*
* Copyright (c) 2011 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* 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
* OWNER 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.
*/
#include <machine/rtems-bsd-kernel-space.h>
#include <rtems/bsd/sys/param.h>
#include <rtems/bsd/sys/types.h>
#include <sys/kernel.h>
int
config_intrhook_establish(struct intr_config_hook *hook)
{
(*hook->ich_func)(hook->ich_arg);
return (0);
}
void
config_intrhook_disestablish(struct intr_config_hook *hook)
{
/* Do nothing */
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,220 @@
/*
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. 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.
*
* 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
* OWNER 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.
*/
#ifndef DW_MMC_DW_MMCREG_H
#define DW_MMC_DW_MMCREG_H
#define DW_MMC_CTRL 0x000
#define DW_MMC_PWREN 0x004
#define DW_MMC_CLKDIV 0x008
#define DW_MMC_CLKSRC 0x00c
#define DW_MMC_CLKENA 0x010
#define DW_MMC_TMOUT 0x014
#define DW_MMC_CTYPE 0x018
#define DW_MMC_BLKSIZ 0x01c
#define DW_MMC_BYTCNT 0x020
#define DW_MMC_INTMASK 0x024
#define DW_MMC_CMDARG 0x028
#define DW_MMC_CMD 0x02c
#define DW_MMC_RESP0 0x030
#define DW_MMC_RESP1 0x034
#define DW_MMC_RESP2 0x038
#define DW_MMC_RESP3 0x03c
#define DW_MMC_MINTSTS 0x040
#define DW_MMC_RINTSTS 0x044
#define DW_MMC_STATUS 0x048
#define DW_MMC_FIFOTH 0x04c
#define DW_MMC_CDETECT 0x050
#define DW_MMC_WRTPRT 0x054
#define DW_MMC_GPIO 0x058
#define DW_MMC_TCBCNT 0x05c
#define DW_MMC_TBBCNT 0x060
#define DW_MMC_DEBNCE 0x064
#define DW_MMC_USRID 0x068
#define DW_MMC_VERID 0x06c
#define DW_MMC_HCON 0x070
#define DW_MMC_UHS_REG 0x074
#define DW_MMC_RST_N 0x078
#define DW_MMC_BMOD 0x080
#define DW_MMC_PLDMND 0x084
#define DW_MMC_DBADDR 0x088
#define DW_MMC_IDSTS 0x08c
#define DW_MMC_IDINTEN 0x090
#define DW_MMC_DSCADDR 0x094
#define DW_MMC_BUFADDR 0x098
#define DW_MMC_DATA 0x200
/* Control Register */
#define DW_MMC_CTRL_DMA_ENABLE (1u << 25)
#define DW_MMC_CTRL_CEATA_INT_EN (1u << 11)
#define DW_MMC_CTRL_SEND_AS_CCSD (1u << 10)
#define DW_MMC_CTRL_SEND_CCSD (1u << 9)
#define DW_MMC_CTRL_ABRT_READ_DATA (1u << 8)
#define DW_MMC_CTRL_SEND_IRQ_RESP (1u << 7)
#define DW_MMC_CTRL_READ_WAIT (1u << 6)
#define DW_MMC_CTRL_INT_ENABLE (1u << 4)
#define DW_MMC_CTRL_DMA_RESET (1u << 2)
#define DW_MMC_CTRL_FIFO_RESET (1u << 1)
#define DW_MMC_CTRL_RESET (1u << 0)
/* Power Enable Register */
#define DW_MMC_PWREN_ENABLE (1u << 0)
/* Clock Enable Register */
#define DW_MMC_CLKEN_LOW_PWR (1u << 16)
#define DW_MMC_CLKEN_ENABLE (1u << 0)
/* Timeout Register */
#define DW_MMC_TMOUT_DATA(x) ((x) << 8)
#define DW_MMC_TMOUT_DATA_MSK 0xffffff00
#define DW_MMC_TMOUT_RESP(x) ((x) & 0xFF)
#define DW_MMC_TMOUT_RESP_MSK 0xff
/* Card Type Register */
#define DW_MMC_CTYPE_8BIT (1u << 16)
#define DW_MMC_CTYPE_4BIT (1u << 0)
#define DW_MMC_CTYPE_1BIT 0
/* Interrupt Status and Interrupt Mask Register */
#define DW_MMC_INT_SDIO(x) (1u << (16 + (x)))
#define DW_MMC_INT_EBE (1u << 15)
#define DW_MMC_INT_ACD (1u << 14)
#define DW_MMC_INT_SBE (1u << 13)
#define DW_MMC_INT_HLE (1u << 12)
#define DW_MMC_INT_FRUN (1u << 11)
#define DW_MMC_INT_HTO (1u << 10)
#define DW_MMC_INT_DRTO (1u << 9)
#define DW_MMC_INT_RTO (1u << 8)
#define DW_MMC_INT_DCRC (1u << 7)
#define DW_MMC_INT_RCRC (1u << 6)
#define DW_MMC_INT_RXDR (1u << 5)
#define DW_MMC_INT_TXDR (1u << 4)
#define DW_MMC_INT_DTO (1u << 3)
#define DW_MMC_INT_CMD_DONE (1u << 2)
#define DW_MMC_INT_RE (1u << 1)
#define DW_MMC_INT_CD (1u << 0)
#define DW_MMC_INT_ERROR (DW_MMC_INT_RE | DW_MMC_INT_RCRC | DW_MMC_INT_DCRC \
| DW_MMC_INT_DRTO | DW_MMC_INT_RTO | DW_MMC_INT_EBE)
/* Command Register */
#define DW_MMC_CMD_START (1u << 31)
#define DW_MMC_CMD_USE_HOLD_REG (1u << 29)
#define DW_MMC_CMD_VOLT_SWITCH (1u << 28)
#define DW_MMC_CMD_BOOT_MODE (1u << 27)
#define DW_MMC_CMD_DISABLE_BOOT (1u << 26)
#define DW_MMC_CMD_EXP_BOOT_ACK (1u << 25)
#define DW_MMC_CMD_ENABLE_BOOT (1u << 24)
#define DW_MMC_CMD_CCS_EXP (1u << 23)
#define DW_MMC_CMD_CEATA_RD (1u << 22)
#define DW_MMC_CMD_UPDATE_CLK (1u << 21)
#define DW_MMC_CMD_SEND_INIT (1u << 15)
#define DW_MMC_CMD_STOP_ABRT (1u << 14)
#define DW_MMC_CMD_PRV_DATA_WAIT (1u << 13)
#define DW_MMC_CMD_SEND_STOP (1u << 12)
#define DW_MMC_CMD_STREAM_MODE (1u << 11)
#define DW_MMC_CMD_DATA_WR (1u << 10)
#define DW_MMC_CMD_DATA_EXP (1u << 9)
#define DW_MMC_CMD_RESP_CRC (1u << 8)
#define DW_MMC_CMD_RESP_LONG (1u << 7)
#define DW_MMC_CMD_RESP_EXP (1u << 6)
#define DW_MMC_CMD_INDEX(x) ((x) & 0x1f)
/* Status Register */
#define DW_MMC_STATUS_GET_FIFO_CNT(x) (((x) >> 17) & 0x1fff)
#define DW_MMC_STATUS_GET_RESP_IDX(x) (((x) >> 11) & 0x3f)
#define DW_MMC_STATUS_DS_MC_BUSY (1u << 10)
#define DW_MMC_STATUS_CARD_DATA_BUSY (1u << 9)
#define DW_MMC_STATUS_CARD_PRESENT (1u << 8)
#define DW_MMC_STATUS_GET_FSM_STATE(x) (((x) >> 4) & 0xf)
#define DW_MMC_STATUS_FIFO_FULL (1u << 3)
#define DW_MMC_STATUS_FIFO_EMPTY (1u << 2)
#define DW_MMC_STATUS_FIFO_TX_WM (1u << 1)
#define DW_MMC_STATUS_FIFO_RX_WM (1u << 0)
/* DMA and FIFO Control Register */
#define DW_MMC_FIFOTH_BSZ(x) ((x) << 28)
#define DW_MMC_FIFOTH_BSZ_MSK DW_MMC_FIFOTH_BSZ(0x7)
#define DW_MMC_FIFOTH_RX_WMARK(x) ((x) << 16)
#define DW_MMC_FIFOTH_RX_WMARK_MSK DW_MMC_FIFOTH_RX_WMARK(0xfff)
#define DW_MMC_FIFOTH_TX_WMARK(x) ((x) << 0)
#define DW_MMC_FIFOTH_TX_WMARK_MSK DW_MMC_FIFOTH_TX_WMARK(0xfff)
/* Card Detect Register */
#define DW_MMC_CDETECT_NOT_DETECTED (1u << 0)
/* Write Protect Register */
#define DW_MMC_WRTPRT_ENABLED (1u << 0)
/* Hardware Reset Register */
#define DW_MMC_RST_N_ACTIVE_MODE (1u << 0)
/* Bus Mode Register */
#define DW_MMC_BMOD_DE (1u << 7)
#define DW_MMC_BMOD_FB (1u << 1)
#define DW_MMC_BMOD_SWR (1u << 0)
/* Internal DMAC Status and Interrupt DMAC Interrupt Enable Register */
#define DW_MMC_IDMAC_INT_GET_FSM(x) (((x) >> 13) & 0xf)
#define DW_MMC_IDMAC_INT_GET_EB(x) (((x) >> 10) & 0x7)
#define DW_MMC_IDMAC_INT_AIS (1u << 9)
#define DW_MMC_IDMAC_INT_NIS (1u << 8)
#define DW_MMC_IDMAC_INT_CES (1u << 5)
#define DW_MMC_IDMAC_INT_DU (1u << 4)
#define DW_MMC_IDMAC_INT_FBE (1u << 2)
#define DW_MMC_IDMAC_INT_RI (1u << 1)
#define DW_MMC_IDMAC_INT_TI (1u << 0)
/* Internal DMA descriptor */
struct dw_mmc_des {
uint32_t des0;
uint32_t des1;
uint32_t des2;
uint32_t des3;
};
#define DW_MMC_DES0_OWN (1u << 31)
#define DW_MMC_DES0_CES (1u << 30)
#define DW_MMC_DES0_ER (1u << 5)
#define DW_MMC_DES0_CH (1u << 4)
#define DW_MMC_DES0_FS (1u << 3)
#define DW_MMC_DES0_LD (1u << 2)
#define DW_MMC_DES0_DIC (1u << 1)
#define DW_MMC_DES1_BS2(x) ((x) << 13)
#define DW_MMC_DES1_BS1(x) ((x) << 0)
#define DW_MMC_DES1_MAX_BS 4096
/* FIFO dimensions */
#define DW_MMC_FIFO_DEPTH 1024
#define DW_MMC_FIFO_WIDTH 4
#endif /* DW_MMC_DW_MMCREG_H */