---
 freebsd/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c | 19 +++++++++++++++++
 freebsd/sys/dev/sdhci/sdhci.c                    | 19 +++++++++++++++++
 freebsd/sys/dev/sdhci/sdhci.h                    |  5 +++++
 libbsd_waf.py                                    |  1 +
 rtemsbsd/include/bsp/nexus-devices.h             |  3 +++
 rtemsbsd/include/machine/rtems-bsd-nexus-bus.h   | 26 ++++++++++++++++++++++++
 6 files changed, 73 insertions(+)

diff --git a/freebsd/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c 
b/freebsd/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
index 4844f19..2e8290a 100644
--- a/freebsd/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
+++ b/freebsd/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
@@ -43,9 +43,11 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/bus.h>
 
+#ifndef __rtems__
 #include <dev/fdt/fdt_common.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
+#endif /* __rtems__ */
 
 #include <dev/mmc/bridge.h>
 #include <dev/mmc/mmcreg.h>
@@ -55,7 +57,9 @@ __FBSDID("$FreeBSD$");
 #include <rtems/bsd/local/sdhci_if.h>
 
 #include "bcm2835_dma.h"
+#ifndef __rtems__
 #include <arm/broadcom/bcm2835/bcm2835_mbox_prop.h>
+#endif /* __rtems__ */
 #include "bcm2835_vcbus.h"
 
 #define        BCM2835_DEFAULT_SDHCI_FREQ      50
@@ -125,11 +129,13 @@ static int
 bcm_sdhci_probe(device_t dev)
 {
 
+#ifndef __rtems__
        if (!ofw_bus_status_okay(dev))
                return (ENXIO);
 
        if (!ofw_bus_is_compatible(dev, "broadcom,bcm2835-sdhci"))
                return (ENXIO);
+#endif /* __rtems__ */
 
        device_set_desc(dev, "Broadcom 2708 SDHCI controller");
        return (BUS_PROBE_DEFAULT);
@@ -140,13 +146,17 @@ bcm_sdhci_attach(device_t dev)
 {
        struct bcm_sdhci_softc *sc = device_get_softc(dev);
        int rid, err;
+#ifndef __rtems__
        phandle_t node;
        pcell_t cell;
+#endif /* __rtems__ */
+
        u_int default_freq;
 
        sc->sc_dev = dev;
        sc->sc_req = NULL;
 
+#ifndef __rtems__
        err = bcm2835_mbox_set_power_state(BCM2835_MBOX_POWER_ID_EMMC,
            TRUE);
        if (err != 0) {
@@ -168,6 +178,7 @@ bcm_sdhci_attach(device_t dev)
                    sizeof(cell))) > 0)
                        default_freq = cell / 1000000;
        }
+#endif /* __rtems__ */
        if (default_freq == 0)
                default_freq = BCM2835_DEFAULT_SDHCI_FREQ;
 
@@ -216,6 +227,7 @@ bcm_sdhci_attach(device_t dev)
  
        sdhci_init_slot(dev, &sc->sc_slot, 0);
 
+#ifndef __rtems__
        sc->sc_dma_ch = bcm_dma_allocate(BCM_DMA_CH_ANY);
        if (sc->sc_dma_ch == BCM_DMA_CH_INVALID)
                goto fail;
@@ -243,6 +255,7 @@ bcm_sdhci_attach(device_t dev)
 
        sc->sc_sdhci_buffer_phys = BUS_SPACE_PHYSADDR(sc->sc_mem_res, 
            SDHCI_BUFFER);
+#endif /* __rtems__ */
 
        bus_generic_probe(dev);
        bus_generic_attach(dev);
@@ -671,7 +684,13 @@ static driver_t bcm_sdhci_driver = {
        sizeof(struct bcm_sdhci_softc),
 };
 
+#ifndef __rtems__
 DRIVER_MODULE(sdhci_bcm, simplebus, bcm_sdhci_driver, bcm_sdhci_devclass, 0, 
0);
 MODULE_DEPEND(sdhci_bcm, sdhci, 1, 1, 1);
+#else /* __rtems__ */
+DRIVER_MODULE(sdhci_bcm, nexus, bcm_sdhci_driver, bcm_sdhci_devclass, 0, 0);
+MODULE_DEPEND(sdhci_bcm, sdhci, 1, 1, 1);
 DRIVER_MODULE(mmc, sdhci_bcm, mmc_driver, mmc_devclass, NULL, NULL);
 MODULE_DEPEND(sdhci_bcm, mmc, 1, 1, 1);
+#endif  /* __rtems__ */
+
diff --git a/freebsd/sys/dev/sdhci/sdhci.c b/freebsd/sys/dev/sdhci/sdhci.c
index 6ba9777..1ad7d5d 100644
--- a/freebsd/sys/dev/sdhci/sdhci.c
+++ b/freebsd/sys/dev/sdhci/sdhci.c
@@ -482,7 +482,11 @@ sdhci_card_delay(void *arg)
 {
        struct sdhci_slot *slot = arg;
 
+#ifndef __rtems__
        taskqueue_enqueue(taskqueue_swi_giant, &slot->card_task);
+#else /* __rtems__ */
+       taskqueue_enqueue(slot->sdhci_tq, &slot->card_task);
+#endif  /* __rtems__ */
 }
  
 static void
@@ -602,7 +606,11 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, int 
num)
                slot->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
        }
 
+#ifndef __rtems__
        slot->host.f_min = SDHCI_MIN_FREQ(slot->bus, slot);
+#else /* __rtems__ */
+       slot->host.f_min = 400000;
+#endif /* __rtems__ */
        slot->host.f_max = slot->max_clk;
        slot->host.host_ocr = 0;
        if (caps & SDHCI_CAN_VDD_330)
@@ -650,10 +658,12 @@ sdhci_init_slot(device_t dev, struct sdhci_slot *slot, 
int num)
        }
 
        slot->timeout = 10;
+#ifndef __rtems__
        SYSCTL_ADD_INT(device_get_sysctl_ctx(slot->bus),
            SYSCTL_CHILDREN(device_get_sysctl_tree(slot->bus)), OID_AUTO,
            "timeout", CTLFLAG_RW, &slot->timeout, 0,
            "Maximum timeout for SDHCI transfers (in secs)");
+#endif
        TASK_INIT(&slot->card_task, 0, sdhci_card_task, slot);
        callout_init(&slot->card_callout, 1);
        callout_init_mtx(&slot->timeout_callout, &slot->mtx, 0);
@@ -674,7 +684,11 @@ sdhci_cleanup_slot(struct sdhci_slot *slot)
 
        callout_drain(&slot->timeout_callout);
        callout_drain(&slot->card_callout);
+#ifndef __rtems__
        taskqueue_drain(taskqueue_swi_giant, &slot->card_task);
+#else /* __rtems__ */
+       taskqueue_drain(slot->sdhci_tq, &slot->card_task);
+#endif  /* __rtems__ */
 
        SDHCI_LOCK(slot);
        d = slot->dev;
@@ -1332,8 +1346,13 @@ sdhci_generic_intr(struct sdhci_slot *slot)
                        if (bootverbose || sdhci_debug)
                                slot_printf(slot, "Card removed\n");
                        callout_stop(&slot->card_callout);
+#ifndef __rtems__
                        taskqueue_enqueue(taskqueue_swi_giant,
                            &slot->card_task);
+#else /* __rtems__ */
+                       taskqueue_enqueue(slot->sdhci_tq,
+                           &slot->card_task);
+#endif  /* __rtems__ */
                }
                if (intmask & SDHCI_INT_CARD_INSERT) {
                        if (bootverbose || sdhci_debug)
diff --git a/freebsd/sys/dev/sdhci/sdhci.h b/freebsd/sys/dev/sdhci/sdhci.h
index 2638b4f..b63cf7d 100644
--- a/freebsd/sys/dev/sdhci/sdhci.h
+++ b/freebsd/sys/dev/sdhci/sdhci.h
@@ -273,7 +273,11 @@ struct sdhci_slot {
        device_t        dev;            /* Slot device */
        u_char          num;            /* Slot number */
        u_char          opt;            /* Slot options */
+#ifndef __rtems__
 #define SDHCI_HAVE_DMA                 1
+#else /* rtems */
+#define SDHCI_HAVE_DMA                 0
+#endif /* __rtems__ */
 #define SDHCI_PLATFORM_TRANSFER                2
        u_char          version;
        int             timeout;        /* Transfer timeout */
@@ -284,6 +288,7 @@ struct sdhci_slot {
        u_char          *dmamem;
        bus_addr_t      paddr;          /* DMA buffer address */
        struct task     card_task;      /* Card presence check task */
+       struct taskqueue *sdhci_tq;
        struct callout  card_callout;   /* Card insert delay callout */
        struct callout  timeout_callout;/* Card command/data response timeout */
        struct mmc_host host;           /* Host parameters */
diff --git a/libbsd_waf.py b/libbsd_waf.py
index 63cf7d2..f6aee63 100644
--- a/libbsd_waf.py
+++ b/libbsd_waf.py
@@ -1047,6 +1047,7 @@ def build(bld):
               'rtemsbsd/local/mmcbus_if.c',
               'rtemsbsd/local/pci_if.c',
               'rtemsbsd/local/pcib_if.c',
+              'rtemsbsd/local/sdhci_if.c',
               'rtemsbsd/local/usb_if.c',
               'rtemsbsd/mdns/mdns-hostname-default.c',
               'rtemsbsd/mdns/mdns.c',
diff --git a/rtemsbsd/include/bsp/nexus-devices.h 
b/rtemsbsd/include/bsp/nexus-devices.h
index cbffcf6..3040c5b 100644
--- a/rtemsbsd/include/bsp/nexus-devices.h
+++ b/rtemsbsd/include/bsp/nexus-devices.h
@@ -100,6 +100,9 @@ RTEMS_BSD_DRIVER_TSEC(0xffeb0000,
 #include <bsp/raspberrypi.h>
 #include <bsp/irq.h>
 
+RTEMS_BSD_DRIVER_BCM2835_SD((unsigned long)BCM2835_EMMC_BASE, 62);
+RTEMS_BSD_DRIVER_BCM2835_SDHCI;
+RTEMS_BSD_DRIVER_MMC;
 RTEMS_BSD_DRIVER_BCM2835_DMA((unsigned long)0x20007000, 16);
 
 #endif
diff --git a/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h 
b/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h
index 25688a0..d92f68a 100644
--- a/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h
+++ b/rtemsbsd/include/machine/rtems-bsd-nexus-bus.h
@@ -172,6 +172,32 @@ extern "C" {
 #endif /* RTEMS_BSD_DRIVER_MMC */
 
 /*
+ * [BCM2835] Raspberry Pi Arasan SDHCI Controller
+ */
+#if !defined(RTEMS_BSD_DRIVER_BCM2835_SDHCI)
+  #define RTEMS_BSD_DRIVER_BCM2835_SDHCI                         \
+    SYSINIT_DRIVER_REFERENCE(mmc, sdhci_bcm)
+#endif
+
+#if !defined(RTEMS_BSD_DRIVER_BCM2835_SD)
+  #define RTEMS_BSD_DRIVER_BCM2835_SD(_base, _irq)               \
+    static const rtems_bsd_device_resource rpi_emmc_res[] = {    \
+      {                                                          \
+        .type = RTEMS_BSD_RES_MEMORY,                            \
+        .start_request = 0,                                      \
+        .start_actual = (_base)                                  \
+      }, {                                                       \
+        .type = RTEMS_BSD_RES_IRQ,                               \
+        .start_request = 0,                                      \
+        .start_actual = (_irq)                                   \
+      }                                                          \
+    };                                                           \
+    RTEMS_BSD_DEFINE_NEXUS_DEVICE(sdhci_bcm, 0,                  \
+                                  RTEMS_ARRAY_SIZE(rpi_emmc_res),\
+                                  &rpi_emmc_res[0])
+#endif /* RTEMS_BSD_DRIVER_BCM2835_SD */
+
+/*
  * [BCM2835] Raspberry Pi DMA Controller
  */
 #if !defined(RTEMS_BSD_DRIVER_BCM2835_DMA)
-- 
2.1.4

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to