From eed2313667d3ef821b4fa365553d150ed87b4c9b Mon Sep 17 00:00:00 2001
From: patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>
Date: Tue, 10 Nov 2009 18:32:51 +0000
Subject: [PATCH] Separate SDIO interface from MMCSD

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2241 42af7a65-404d-4744-a932-0658087f49c3
---
 drivers/mmcsd/mmcsd.c |   9 +-
 include/nuttx/mmcsd.h | 482 +------------------------------------
 include/nuttx/sdio.h  | 543 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 551 insertions(+), 483 deletions(-)
 create mode 100755 include/nuttx/sdio.h

diff --git a/drivers/mmcsd/mmcsd.c b/drivers/mmcsd/mmcsd.c
index bb97168cd5..348c463218 100644
--- a/drivers/mmcsd/mmcsd.c
+++ b/drivers/mmcsd/mmcsd.c
@@ -49,6 +49,7 @@
 
 #include <nuttx/fs.h>
 #include <nuttx/rwbuffer.h>
+#include <nuttx/sdio.h>
 #include <nuttx/mmcsd.h>
 
 /****************************************************************************
@@ -66,14 +67,14 @@
 
 struct mmcsd_state_s
 {
-  struct mmcsd_dev_s *dev;         /* The MMCSD device bound to this instance */
+  struct sdio_dev_s *dev;         /* The MMCSD device bound to this instance */
   ubyte  crefs;                    /* Open references on the driver */
 
   /* Status flags */
 
   ubyte widebus:1;                 /* TRUE: Wide 4-bit bus selected */
   ubyte mediachange:1;             /* TRUE: Media changed since last check */
-#ifdef CONFIG_MMCSD_DMA
+#ifdef CONFIG_SDIO_DMA
   ubyte dma:1;                     /* TRUE: hardware supports DMA */
 #endif
 
@@ -349,7 +350,7 @@ static int mmcsd_hwinitialize(struct mmcsd_state_s *priv)
 
 static inline void mmcsd_hwuninitialize(struct mmcsd_state_s *priv)
 {
-  MMCSD_RESET(priv->dev);
+  SDIO_RESET(priv->dev);
 }
 
 /****************************************************************************
@@ -373,7 +374,7 @@ static inline void mmcsd_hwuninitialize(struct mmcsd_state_s *priv)
  *
  ****************************************************************************/
 
-int mmcsd_slotinitialize(int minor, int slotno, FAR struct mmcsd_dev_s *dev)
+int mmcsd_slotinitialize(int minor, int slotno, FAR struct sdio_dev_s *dev)
 {
   struct mmcsd_state_s *priv;
   char devname[16];
diff --git a/include/nuttx/mmcsd.h b/include/nuttx/mmcsd.h
index 623252ed84..94b4aede14 100644
--- a/include/nuttx/mmcsd.h
+++ b/include/nuttx/mmcsd.h
@@ -47,488 +47,10 @@
  * Pre-Processor Definitions
  ****************************************************************************/
 
-/* MMC/SD events needed by the driver */
-
-#define MMCSDEVENT_EJECTED       (1 << 0) /* Bit 0: CD/DAT3 transition low, media removed */
-#define MMCSDEVENT_INSERTED      (1 << 1) /* Bit 1: CD/DAT3 transition high, media inserted */
-#define MMCSDEVENT_CMDDONE       (1 << 2) /* Bit 2: Command+response complete */
-#define MMCSDEVENT_READCMDDONE   (1 << 3) /* Bit 3: Read command done */
-#define MMCSDEVENT_WRITECMDDONE  (1 << 4) /* Bit 4: Write command done */
-#define MMCSDEVENT_READDATADONE  (1 << 5) /* Bit 5: Read data done */
-#define MMCSDEVENT_WRITEDATADONE (1 << 6) /* Bit 6: Write data done */
-#define MMCSDEVENT_CMDBUSYDONE   (1 << 7) /* Bit 7: Command with transition to not busy */
-
-#define MMCSDEVENT_ALLEVENTS     0xff
-
-/****************************************************************************
- * Name: MMCSD_RESET
- *
- * Description:
- *   Reset the MMC/SD controller.  Undo all setup and initialization.
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#define MMCSD_RESET(dev) ((dev)->reset(dev))
-
-/****************************************************************************
- * Name: MMCSD_STATUS
- *
- * Description:
- *   Get MMC/SD status.
- *
- * Input Parameters:
- *   dev   - Device-specific state data
- *
- * Returned Value:
- *   Returns a bitset of status values (see MMCSD_STATUS_* defines)
- *
- ****************************************************************************/
-
-#define MMCSD_STATUS(dev)        ((d)->status(dev))
-
-/* MMC/SD status bits */
-
-#define MMCSD_STATUS_PRESENT     0x01 /* Bit 0=1: MMC/SD card present */
-#define MMCSD_STATUS_WRPROTECTED 0x02 /* Bit 1=1: MMC/SD card write protected */
-
-#define MMCSD_PRESENT(dev)       ((MMCSD_STATUS(dev) & MMCSD_STATUS_PRESENT) != 0)
-#define MMCSD_WRPROTECTED(dev)   ((MMCSD_STATUS(dev) & MMCSD_STATUS_WRPROTECTED) != 0)
-
-/****************************************************************************
- * Name: MMCSD_WIDEBUS
- *
- * Description:
- *   Enable/disable wide (4-bit) data bus
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *   enable - TRUE: enable wide bus
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#define MMCSD_WIDEBUS(dev,enable) ((dev)->widebus(dev,enable))
-
-/****************************************************************************
- * Name: MMCSD_CLOCK
- *
- * Description:
- *   Enable/disable MMC/SD clocking
- *
- * Input Parameters:
- *   dev  - An instance of the MMC/SD device interface
- *   rate - Specifies the clocking to use (see enum mmcsd_clock_e)
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#define MMCSD_CLOCK(dev,rate) ((dev)->clock(dev,rate))
-
-/****************************************************************************
- * Name: MMCSD_SETBLOCKLEN
- *
- * Description:
- *   Set the MMC/SD block length and block count
- *
- * Input Parameters:
- *   dev      - An instance of the MMC/SD device interface
- *   blocklen - The block length
- *   nblocks  - The block count
- *
- * Returned Value:
- *   OK on success; negated errno on failure
- *
- ****************************************************************************/
-
-#define MMCSD_SETBLOCKLEN(dev,blocklen,nblocks) \
-  ((dev)->setblocklen(dev,blocklen,nblocks))
-
-/****************************************************************************
- * Name: MMCSD_ATTACH
- *
- * Description:
- *   Attach and prepare interrupts
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   OK on success; A negated errno on failure.
- *
- ****************************************************************************/
-
-#define MMCSD_ATTACH(dev) ((dev)->attach(dev))
-
-/****************************************************************************
- * Name: MMCSD_SENDCMD
- *
- * Description:
- *   Send the MMC/SD command
- *
- * Input Parameters:
- *   dev  - An instance of the MMC/SD device interface
- *   cmd  - The command to send
- *   arg  - 32-bit argument required with some commands
- *   data - A reference to data required with some commands
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#define MMCSD_SENDCMD(dev,cmd,arg,data) ((dev)->sendcmd(dev,cmd,arg,data))
-
-/****************************************************************************
- * Name: MMCSD_SENDDATA
- *
- * Description:
- *   Send more MMC/SD data
- *
- * Input Parameters:
- *   dev  - An instance of the MMC/SD device interface
- *   data - Data to be sent
- *
- * Returned Value:
- *   Number of bytes sent on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#define MMCSD_SENDDATA(dev,data) ((dev)->senddata(dev,data))
-
-/****************************************************************************
- * Name: MMCSD_RECVRx
- *
- * Description:
- *   Receive response to MMC/SD command
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *   buffer - Buffer in which to receive the response
- *
- * Returned Value:
- *   Number of bytes sent on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#define MMCSD_RECVR1(dev,buffer) ((dev)->recvR1(dev,buffer))
-#define MMCSD_RECVR2(dev,buffer) ((dev)->recvR2(dev,buffer))
-#define MMCSD_RECVR3(dev,buffer) ((dev)->recvR3(dev,buffer))
-#define MMCSD_RECVR4(dev,buffer) ((dev)->recvR4(dev,buffer))
-#define MMCSD_RECVR5(dev,buffer) ((dev)->recvR5(dev,buffer))
-#define MMCSD_RECVR6(dev,buffer) ((dev)->recvR6(dev,buffer))
-
-/****************************************************************************
- * Name: MMCSD_RECVDATA
- *
- * Description:
- *   Receive data from MMC/SD
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *   buffer - Buffer in which to receive the data
- *
- * Returned Value:
- *   Number of bytes sent on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#define MMCSD_RECVDATA(dev,buffer) ((dev)->recvdata(dev,buffer))
-
-/****************************************************************************
- * Name: MMCSD_EVENTENABLE
- *
- * Description:
- *   Enable/disable notification of a set of MMC/SD events
- *
- * Input Parameters:
- *   dev      - An instance of the MMC/SD device interface
- *   eventset - A bitset of events to enable or disable (see MMCSDEVENT_*
- *              definitions
- *   enable   - TRUE: enable event; FALSE: disable events
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#define MMCSD_EVENTENABLE(dev,eventset)  ((dev)->eventenable(dev,eventset,TRUE))
-#define MMCSD_EVENTDISABLE(dev,eventset) ((dev)->eventenable(dev,eventset,FALSE))
-#define MMCSD_EVENTDISABLEALL(dev)       ((dev)->eventenable(dev,MMCSDEVENT_ALLEVENTS,FALSE))
-
-/****************************************************************************
- * Name: MMCSD_EVENTWAIT
- *
- * Description:
- *   Wait for one of the enabled events to occur (or a timeout)
- *
- * Input Parameters:
- *   dev     - An instance of the MMC/SD device interface
- *   timeout - Maximum time in milliseconds to wait.  Zero means no timeout.
- *
- * Returned Value:
- *   Event set containing the event(s) that ended the wait.  If no events the
- *   returned event set is zero, then the wait was terminated by the timeout.
- *
- ****************************************************************************/
-
-#define MMCSD_EVENTWAIT(dev,timeout)  ((dev)->eventwait(dev,timeout))
-
-/****************************************************************************
- * Name: MMCSD_EVENTS
- *
- * Description:
- *   Return the current event set.  This supports polling for MMC/SD (vs.
- *   waiting).
- *
- * Input Parameters:
- *   dev     - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   Event set containing the current events (cleared after reading).
- *
- ****************************************************************************/
-
-#define MMCSD_EVENTS(dev)  ((dev)->events(dev))
-
-/****************************************************************************
- * Name: MMCSD_DMASUPPORTED
- *
- * Description:
- *   Return TRUE if the hardware can support DMA
- *
- * Input Parameters:
- *   dev - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   TRUE if DMA is supported.
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMASUPPORTED(dev) ((dev)->dmasupported(dev))
-#else
-#  define MMCSD_DMASUPPORTED(dev) (FALSE)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_COHERENT
- *
- * Description:
- *   If the processor supports a data cache, then this method will make sure
- *   that the contents of the DMA memory and the data cache are coherent in
- *   preparation for the DMA transfer.  For write transfers, this may mean
- *   flushing the data cache, for read transfers this may mean invalidating
- *   the data cache.
- *
- * Input Parameters:
- *   dev   - An instance of the MMC/SD device interface
- *   addr  - The beginning address of the DMA
- *   len   - The length of the DMA
- *   write - TRUE: A write DMA will be performed; FALSE: a read DMA will be
- *           performed.
- *
- * Returned Value:
- *   None
- *
- ****************************************************************************/
-
-#if defined(CONFIG_MMCSD_DMA) && defined(CONFIG_DATA_CACHE)
-#  define MMCSD_COHERENT(dev,addr,len,write) ((dev)->coherent(dev,addr,len,write))
-#else
-#  define MMCSD_COHERENT(dev,addr,len,write)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_DMAREADSETUP
- *
- * Description:
- *   Setup to perform a read DMA
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *   buffer - The memory to DMA from
- *
- * Returned Value:
- *   OK on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMAREADSETUP(dev,buffer) ((dev)->dmareadsetup(dev,buffer))
-#else
-#  define MMCSD_DMAREADSETUP(dev,buffer) (-ENOSYS)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_DMAWRITESETUP
- *
- * Description:
- *   Setup to perform a write DMA
- *
- * Input Parameters:
- *   dev    - An instance of the MMC/SD device interface
- *   buffer - The memory to DMA into
- *
- * Returned Value:
- *   OK on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMAWRITESETUP(dev,buffer) ((dev)->dmawritesetup(dev,buffer))
-#else
-#  define MMCSD_DMAWRITESETUP(dev,buffer) (-ENOSYS)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_DMASTART
- *
- * Description:
- *   Start the DMA
- *
- * Input Parameters:
- *   dev - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   OK on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMASTART(dev) ((dev)->dmastart(dev))
-#else
-#  define MMCSD_DMASTART(dev) (-ENOSYS)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_DMASTOP
- *
- * Description:
- *   Stop the DMA
- *
- * Input Parameters:
- *   dev - An instance of the MMC/SD device interface
- *
- * Returned Value:
- *   OK on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMASTOP(dev) ((dev)->dmastop(dev))
-#else
-#  define MMCSD_DMASTOP(dev) (-ENOSYS)
-#endif
-
-/****************************************************************************
- * Name: MMCSD_DMASTATUS
- *
- * Description:
- *   Returnt the number of bytes remaining in the DMA transfer
- *
- * Input Parameters:
- *   dev       - An instance of the MMC/SD device interface
- *   remaining - A pointer to location in which to return the number of bytes
- *               remaining in the transfer.
- *
- * Returned Value:
- *   OK on succes; a negated errno on failure
- *
- ****************************************************************************/
-
-#ifdef CONFIG_MMCSD_DMA
-#  define MMCSD_DMASTATUS(dev,remaining) ((dev)->dmastatus(dev,remaining))
-#else
-#  define MMCSD_DMASTATUS(dev,remaining) (-ENOSYS)
-#endif
-
 /****************************************************************************
  * Public Types
  ****************************************************************************/
 
-/* Various clocking used by the MMC/SD driver */
-
-enum mmcsd_clock_e
-{
-  CLOCK_MMCSD_DISABLED = 0, /* Clock is disabled */
-  CLOCK_MMC_SLOW,           /* MMC initialization clocking */
-  CLOCK_SD_SLOW,            /* SD initialization clocking */
-  CLOCK_MMC_FAST,           /* MMC normal operation clocking */
-  CLOCK_SD_FAST             /* SD normal operation clocking */
-};
-
-/* This structure defines the interface between the NuttX MMC/SD
- * driver and the chip- or board-specific MMC/SD interface.  This
- * interface is only used in architectures that support MMC/SD
- * 1- or 4-bit data busses.  This interface is registered with
- * the NuttX MMC/SD driver by calling mmcsd_slotinitialize() as
- * described below.
- *
- * Architectures that use an SPI interface to the MMC/SD slot
- * should support, instead, the struct spi_dev_s interface (see
- * include/nuttx/spi.h and the mmcsd_spislotinitialize() interface
- * below.
- */
-
-struct mmcsd_dev_s
-{
-  /* See descriptions of each method in the access macros provided
-   * above.
-   */
-
-  /* Initialization/setup */
-
-  void  (*reset)(FAR struct mmcsd_dev_s *dev);
-  ubyte (*status)(FAR struct mmcsd_dev_s *dev);
-  void  (*widebus)(FAR struct mmcsd_dev_s *dev, boolean enable);
-  void  (*clock)(FAR struct mmcsd_dev_s *dev, enum mmcsd_clock_e rate);
-  int   (*setblocklen)(FAR struct mmcsd_dev_s *dev, int blocklen, int nblocks);
-  int   (*attach)(FAR struct mmcsd_dev_s *dev);
-
-  /* Command/Status/Data Transfer */
-
-  void  (*sendcmd)(FAR struct mmcsd_dev_s *dev, ubyte cmd, uint32 arg, FAR const ubyte *data);
-  int   (*senddata)(FAR struct mmcsd_dev_s *dev, FAR const ubyte *buffer);
-
-  int   (*recvR1)(FAR struct mmcsd_dev_s *dev, uint16 buffer[3]);
-  int   (*recvR2)(FAR struct mmcsd_dev_s *dev, uint16 buffer[8]);
-  int   (*recvR3)(FAR struct mmcsd_dev_s *dev, uint16 buffer[3]);
-  int   (*recvR4)(FAR struct mmcsd_dev_s *dev, uint16 buffer[3]);
-  int   (*recvR5)(FAR struct mmcsd_dev_s *dev, uint16 buffer[3]);
-  int   (*recvR6)(FAR struct mmcsd_dev_s *dev, uint16 buffer[3]);
-  int   (*recvdata)(FAR struct mmcsd_dev_s *dev, FAR ubyte *buffer);
-
-  /* EVENT handler */
-
-  void  (*eventenable)(FAR struct mmcsd_dev_s *dev, ubyte eventset, boolean enable);
-  ubyte (*eventwait)(FAR struct mmcsd_dev_s *dev, uint32 timeout);
-  ubyte (*events)(FAR struct mmcsd_dev_s *dev);
-
-  /* DMA */
-
-#ifdef CONFIG_MMCSD_DMA
-  boolean (*dmasupported)(FAR struct mmcsd_dev_s *dev);
-#ifdef CONFIG_DATA_CACHE
-  void  (*coherent)(FAR struct mmcsd_dev_s *dev, FAR void *addr, size_t len, boolean write);
-#endif
-  int   (*dmareadsetup)(FAR struct mmcsd_dev_s *dev, FAR ubyte *buffer);
-  int   (*dmawritesetup)(FAR struct mmcsd_dev_s *dev, FAR const ubyte *buffer);
-  int   (*dmaenable)(FAR struct mmcsd_dev_s *dev);
-  int   (*dmastop)(FAR struct mmcsd_dev_s *dev);
-  int   (*dmastatus)(FAR struct mmcsd_dev_s *dev, size_t *remaining);
-#endif
-};
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -558,7 +80,8 @@ extern "C" {
  *
  ****************************************************************************/
 
-EXTERN int mmcsd_slotinitialize(int minor, int slotno, FAR struct mmcsd_dev_s *dev);
+struct sdio_dev_s; /* See nuttx/sdio.h */
+EXTERN int mmcsd_slotinitialize(int minor, int slotno, FAR struct sdio_dev_s *dev);
 
 /****************************************************************************
  * Name: mmcsd_spislotinitialize
@@ -577,6 +100,7 @@ EXTERN int mmcsd_slotinitialize(int minor, int slotno, FAR struct mmcsd_dev_s *d
  *
  ****************************************************************************/
 
+struct spi_dev_s; /* See nuttx/spi.h */
 EXTERN int mmcsd_spislotinitialize(int minor, int slotno, FAR struct spi_dev_s *spi);
 
 #undef EXTERN
diff --git a/include/nuttx/sdio.h b/include/nuttx/sdio.h
new file mode 100755
index 0000000000..8fe29c572b
--- /dev/null
+++ b/include/nuttx/sdio.h
@@ -0,0 +1,543 @@
+/****************************************************************************
+ * include/nuttx/sdio.h
+ *
+ *   Copyright (C) 2009 Gregory Nutt. All rights reserved.
+ *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ *
+ * 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.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ *    used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * 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 __NUTTX_SDIO_H
+#define __NUTTX_SDIO_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <sys/types.h>
+
+/****************************************************************************
+ * Pre-Processor Definitions
+ ****************************************************************************/
+
+/* MMC/SD events needed by the driver */
+
+#define SDIOEVENT_EJECTED       (1 << 0) /* Bit 0: CD/DAT3 transition low, media removed */
+#define SDIOEVENT_INSERTED      (1 << 1) /* Bit 1: CD/DAT3 transition high, media inserted */
+#define SDIOEVENT_CMDDONE       (1 << 2) /* Bit 2: Command+response complete */
+#define SDIOEVENT_READCMDDONE   (1 << 3) /* Bit 3: Read command done */
+#define SDIOEVENT_WRITECMDDONE  (1 << 4) /* Bit 4: Write command done */
+#define SDIOEVENT_READDATADONE  (1 << 5) /* Bit 5: Read data done */
+#define SDIOEVENT_WRITEDATADONE (1 << 6) /* Bit 6: Write data done */
+#define SDIOEVENT_CMDBUSYDONE   (1 << 7) /* Bit 7: Command with transition to not busy */
+
+#define SDIOEVENT_ALLEVENTS     0xff
+
+/****************************************************************************
+ * Name: SDIO_RESET
+ *
+ * Description:
+ *   Reset the MMC/SD controller.  Undo all setup and initialization.
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#define SDIO_RESET(dev) ((dev)->reset(dev))
+
+/****************************************************************************
+ * Name: SDIO_STATUS
+ *
+ * Description:
+ *   Get MMC/SD status.
+ *
+ * Input Parameters:
+ *   dev   - Device-specific state data
+ *
+ * Returned Value:
+ *   Returns a bitset of status values (see SDIO_STATUS_* defines)
+ *
+ ****************************************************************************/
+
+#define SDIO_STATUS(dev)        ((d)->status(dev))
+
+/* MMC/SD status bits */
+
+#define SDIO_STATUS_PRESENT     0x01 /* Bit 0=1: MMC/SD card present */
+#define SDIO_STATUS_WRPROTECTED 0x02 /* Bit 1=1: MMC/SD card write protected */
+
+#define SDIO_PRESENT(dev)       ((SDIO_STATUS(dev) & SDIO_STATUS_PRESENT) != 0)
+#define SDIO_WRPROTECTED(dev)   ((SDIO_STATUS(dev) & SDIO_STATUS_WRPROTECTED) != 0)
+
+/****************************************************************************
+ * Name: SDIO_WIDEBUS
+ *
+ * Description:
+ *   Enable/disable wide (4-bit) data bus
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *   enable - TRUE: enable wide bus
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#define SDIO_WIDEBUS(dev,enable) ((dev)->widebus(dev,enable))
+
+/****************************************************************************
+ * Name: SDIO_CLOCK
+ *
+ * Description:
+ *   Enable/disable MMC/SD clocking
+ *
+ * Input Parameters:
+ *   dev  - An instance of the MMC/SD device interface
+ *   rate - Specifies the clocking to use (see enum sdio_clock_e)
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#define SDIO_CLOCK(dev,rate) ((dev)->clock(dev,rate))
+
+/****************************************************************************
+ * Name: SDIO_SETBLOCKLEN
+ *
+ * Description:
+ *   Set the MMC/SD block length and block count
+ *
+ * Input Parameters:
+ *   dev      - An instance of the MMC/SD device interface
+ *   blocklen - The block length
+ *   nblocks  - The block count
+ *
+ * Returned Value:
+ *   OK on success; negated errno on failure
+ *
+ ****************************************************************************/
+
+#define SDIO_SETBLOCKLEN(dev,blocklen,nblocks) \
+  ((dev)->setblocklen(dev,blocklen,nblocks))
+
+/****************************************************************************
+ * Name: SDIO_ATTACH
+ *
+ * Description:
+ *   Attach and prepare interrupts
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   OK on success; A negated errno on failure.
+ *
+ ****************************************************************************/
+
+#define SDIO_ATTACH(dev) ((dev)->attach(dev))
+
+/****************************************************************************
+ * Name: SDIO_SENDCMD
+ *
+ * Description:
+ *   Send the MMC/SD command
+ *
+ * Input Parameters:
+ *   dev  - An instance of the MMC/SD device interface
+ *   cmd  - The command to send
+ *   arg  - 32-bit argument required with some commands
+ *   data - A reference to data required with some commands
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#define SDIO_SENDCMD(dev,cmd,arg,data) ((dev)->sendcmd(dev,cmd,arg,data))
+
+/****************************************************************************
+ * Name: SDIO_SENDDATA
+ *
+ * Description:
+ *   Send more MMC/SD data
+ *
+ * Input Parameters:
+ *   dev  - An instance of the MMC/SD device interface
+ *   data - Data to be sent
+ *
+ * Returned Value:
+ *   Number of bytes sent on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#define SDIO_SENDDATA(dev,data) ((dev)->senddata(dev,data))
+
+/****************************************************************************
+ * Name: SDIO_RECVRx
+ *
+ * Description:
+ *   Receive response to MMC/SD command
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *   buffer - Buffer in which to receive the response
+ *
+ * Returned Value:
+ *   Number of bytes sent on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#define SDIO_RECVR1(dev,buffer) ((dev)->recvR1(dev,buffer))
+#define SDIO_RECVR2(dev,buffer) ((dev)->recvR2(dev,buffer))
+#define SDIO_RECVR3(dev,buffer) ((dev)->recvR3(dev,buffer))
+#define SDIO_RECVR4(dev,buffer) ((dev)->recvR4(dev,buffer))
+#define SDIO_RECVR5(dev,buffer) ((dev)->recvR5(dev,buffer))
+#define SDIO_RECVR6(dev,buffer) ((dev)->recvR6(dev,buffer))
+
+/****************************************************************************
+ * Name: SDIO_RECVDATA
+ *
+ * Description:
+ *   Receive data from MMC/SD
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *   buffer - Buffer in which to receive the data
+ *
+ * Returned Value:
+ *   Number of bytes sent on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#define SDIO_RECVDATA(dev,buffer) ((dev)->recvdata(dev,buffer))
+
+/****************************************************************************
+ * Name: SDIO_EVENTENABLE
+ *
+ * Description:
+ *   Enable/disable notification of a set of MMC/SD events
+ *
+ * Input Parameters:
+ *   dev      - An instance of the MMC/SD device interface
+ *   eventset - A bitset of events to enable or disable (see SDIOEVENT_*
+ *              definitions
+ *   enable   - TRUE: enable event; FALSE: disable events
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#define SDIO_EVENTENABLE(dev,eventset)  ((dev)->eventenable(dev,eventset,TRUE))
+#define SDIO_EVENTDISABLE(dev,eventset) ((dev)->eventenable(dev,eventset,FALSE))
+#define SDIO_EVENTDISABLEALL(dev)       ((dev)->eventenable(dev,SDIOEVENT_ALLEVENTS,FALSE))
+
+/****************************************************************************
+ * Name: SDIO_EVENTWAIT
+ *
+ * Description:
+ *   Wait for one of the enabled events to occur (or a timeout)
+ *
+ * Input Parameters:
+ *   dev     - An instance of the MMC/SD device interface
+ *   timeout - Maximum time in milliseconds to wait.  Zero means no timeout.
+ *
+ * Returned Value:
+ *   Event set containing the event(s) that ended the wait.  If no events the
+ *   returned event set is zero, then the wait was terminated by the timeout.
+ *
+ ****************************************************************************/
+
+#define SDIO_EVENTWAIT(dev,timeout)  ((dev)->eventwait(dev,timeout))
+
+/****************************************************************************
+ * Name: SDIO_EVENTS
+ *
+ * Description:
+ *   Return the current event set.  This supports polling for MMC/SD (vs.
+ *   waiting).
+ *
+ * Input Parameters:
+ *   dev     - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   Event set containing the current events (cleared after reading).
+ *
+ ****************************************************************************/
+
+#define SDIO_EVENTS(dev)  ((dev)->events(dev))
+
+/****************************************************************************
+ * Name: SDIO_DMASUPPORTED
+ *
+ * Description:
+ *   Return TRUE if the hardware can support DMA
+ *
+ * Input Parameters:
+ *   dev - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   TRUE if DMA is supported.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMASUPPORTED(dev) ((dev)->dmasupported(dev))
+#else
+#  define SDIO_DMASUPPORTED(dev) (FALSE)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_COHERENT
+ *
+ * Description:
+ *   If the processor supports a data cache, then this method will make sure
+ *   that the contents of the DMA memory and the data cache are coherent in
+ *   preparation for the DMA transfer.  For write transfers, this may mean
+ *   flushing the data cache, for read transfers this may mean invalidating
+ *   the data cache.
+ *
+ * Input Parameters:
+ *   dev   - An instance of the MMC/SD device interface
+ *   addr  - The beginning address of the DMA
+ *   len   - The length of the DMA
+ *   write - TRUE: A write DMA will be performed; FALSE: a read DMA will be
+ *           performed.
+ *
+ * Returned Value:
+ *   None
+ *
+ ****************************************************************************/
+
+#if defined(CONFIG_SDIO_DMA) && defined(CONFIG_DATA_CACHE)
+#  define SDIO_COHERENT(dev,addr,len,write) ((dev)->coherent(dev,addr,len,write))
+#else
+#  define SDIO_COHERENT(dev,addr,len,write)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_DMAREADSETUP
+ *
+ * Description:
+ *   Setup to perform a read DMA
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *   buffer - The memory to DMA from
+ *
+ * Returned Value:
+ *   OK on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMAREADSETUP(dev,buffer) ((dev)->dmareadsetup(dev,buffer))
+#else
+#  define SDIO_DMAREADSETUP(dev,buffer) (-ENOSYS)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_DMAWRITESETUP
+ *
+ * Description:
+ *   Setup to perform a write DMA
+ *
+ * Input Parameters:
+ *   dev    - An instance of the MMC/SD device interface
+ *   buffer - The memory to DMA into
+ *
+ * Returned Value:
+ *   OK on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMAWRITESETUP(dev,buffer) ((dev)->dmawritesetup(dev,buffer))
+#else
+#  define SDIO_DMAWRITESETUP(dev,buffer) (-ENOSYS)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_DMASTART
+ *
+ * Description:
+ *   Start the DMA
+ *
+ * Input Parameters:
+ *   dev - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   OK on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMASTART(dev) ((dev)->dmastart(dev))
+#else
+#  define SDIO_DMASTART(dev) (-ENOSYS)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_DMASTOP
+ *
+ * Description:
+ *   Stop the DMA
+ *
+ * Input Parameters:
+ *   dev - An instance of the MMC/SD device interface
+ *
+ * Returned Value:
+ *   OK on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMASTOP(dev) ((dev)->dmastop(dev))
+#else
+#  define SDIO_DMASTOP(dev) (-ENOSYS)
+#endif
+
+/****************************************************************************
+ * Name: SDIO_DMASTATUS
+ *
+ * Description:
+ *   Returnt the number of bytes remaining in the DMA transfer
+ *
+ * Input Parameters:
+ *   dev       - An instance of the MMC/SD device interface
+ *   remaining - A pointer to location in which to return the number of bytes
+ *               remaining in the transfer.
+ *
+ * Returned Value:
+ *   OK on succes; a negated errno on failure
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SDIO_DMA
+#  define SDIO_DMASTATUS(dev,remaining) ((dev)->dmastatus(dev,remaining))
+#else
+#  define SDIO_DMASTATUS(dev,remaining) (-ENOSYS)
+#endif
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* Various clocking used by the MMC/SD driver */
+
+enum sdio_clock_e
+{
+  CLOCK_SDIO_DISABLED = 0, /* Clock is disabled */
+  CLOCK_MMC_SLOW,           /* MMC initialization clocking */
+  CLOCK_SD_SLOW,            /* SD initialization clocking */
+  CLOCK_MMC_FAST,           /* MMC normal operation clocking */
+  CLOCK_SD_FAST             /* SD normal operation clocking */
+};
+
+/* This structure defines the interface between the NuttX MMC/SD
+ * driver and the chip- or board-specific MMC/SD interface.  This
+ * interface is only used in architectures that support SDIO
+ * 1- or 4-bit data busses.  For MMC/SD support this interface is
+ * registered with the NuttX MMC/SD driver by calling
+ * sdio_slotinitialize().
+ */
+
+struct sdio_dev_s
+{
+  /* See descriptions of each method in the access macros provided
+   * above.
+   */
+
+  /* Initialization/setup */
+
+  void  (*reset)(FAR struct sdio_dev_s *dev);
+  ubyte (*status)(FAR struct sdio_dev_s *dev);
+  void  (*widebus)(FAR struct sdio_dev_s *dev, boolean enable);
+  void  (*clock)(FAR struct sdio_dev_s *dev, enum sdio_clock_e rate);
+  int   (*setblocklen)(FAR struct sdio_dev_s *dev, int blocklen, int nblocks);
+  int   (*attach)(FAR struct sdio_dev_s *dev);
+
+  /* Command/Status/Data Transfer */
+
+  void  (*sendcmd)(FAR struct sdio_dev_s *dev, ubyte cmd, uint32 arg, FAR const ubyte *data);
+  int   (*senddata)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer);
+
+  int   (*recvR1)(FAR struct sdio_dev_s *dev, uint16 buffer[3]);
+  int   (*recvR2)(FAR struct sdio_dev_s *dev, uint16 buffer[8]);
+  int   (*recvR3)(FAR struct sdio_dev_s *dev, uint16 buffer[3]);
+  int   (*recvR4)(FAR struct sdio_dev_s *dev, uint16 buffer[3]);
+  int   (*recvR5)(FAR struct sdio_dev_s *dev, uint16 buffer[3]);
+  int   (*recvR6)(FAR struct sdio_dev_s *dev, uint16 buffer[3]);
+  int   (*recvdata)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer);
+
+  /* EVENT handler */
+
+  void  (*eventenable)(FAR struct sdio_dev_s *dev, ubyte eventset, boolean enable);
+  ubyte (*eventwait)(FAR struct sdio_dev_s *dev, uint32 timeout);
+  ubyte (*events)(FAR struct sdio_dev_s *dev);
+
+  /* DMA */
+
+#ifdef CONFIG_SDIO_DMA
+  boolean (*dmasupported)(FAR struct sdio_dev_s *dev);
+#ifdef CONFIG_DATA_CACHE
+  void  (*coherent)(FAR struct sdio_dev_s *dev, FAR void *addr, size_t len, boolean write);
+#endif
+  int   (*dmareadsetup)(FAR struct sdio_dev_s *dev, FAR ubyte *buffer);
+  int   (*dmawritesetup)(FAR struct sdio_dev_s *dev, FAR const ubyte *buffer);
+  int   (*dmaenable)(FAR struct sdio_dev_s *dev);
+  int   (*dmastop)(FAR struct sdio_dev_s *dev);
+  int   (*dmastatus)(FAR struct sdio_dev_s *dev, size_t *remaining);
+#endif
+};
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+#undef EXTERN
+#if defined(__cplusplus)
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+#undef EXTERN
+#if defined(__cplusplus)
+}
+#endif
+#endif /* __NUTTX_SDIO_H */