--- 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